addet some features

This commit is contained in:
pika 2025-03-22 02:13:26 +01:00
parent 0861ae20c3
commit 97e3262506
11 changed files with 1369 additions and 208 deletions

3
.gitignore vendored
View file

@ -1,4 +1,5 @@
app/routes/__pycache__ app/routes/__pycache__
app/utils/__pycache__ app/utils/__pycache__
app/__pycache__ app/__pycache__
uploads/ uploads/classless.html
classless.html

View file

@ -1,11 +1,24 @@
from flask import Blueprint, render_template, request, current_app, redirect, url_for, abort, flash from flask import Blueprint, render_template, request, current_app, redirect, url_for, abort, flash
import os import os
from app.utils.file_handler import save_file, read_markdown_file, get_file_by_uri, load_uri_map from app.utils.file_handler import save_file, read_markdown_file, get_file_by_uri, load_uri_map, save_uri_map
from app.utils.utils import convert_markdown_to_html
main_bp = Blueprint('main', __name__) main_bp = Blueprint('main', __name__)
@main_bp.route('/', methods=['GET']) @main_bp.route('/', methods=['GET', 'POST'])
def index(): def index():
if request.method == 'POST':
delete_uri = request.form.get('delete_uri')
if delete_uri:
uri_map = load_uri_map()
if delete_uri in uri_map:
# Remove the document from the URI map
del uri_map[delete_uri]
save_uri_map(uri_map)
else:
flash(f'Document with URI "{delete_uri}" not found.')
return redirect(url_for('main.index'))
# List all available documents # List all available documents
uri_map = load_uri_map() uri_map = load_uri_map()
documents = [{'uri': uri, 'filename': info['filename']} for uri, info in uri_map.items()] documents = [{'uri': uri, 'filename': info['filename']} for uri, info in uri_map.items()]
@ -14,22 +27,52 @@ def index():
@main_bp.route('/upload', methods=['GET', 'POST']) @main_bp.route('/upload', methods=['GET', 'POST'])
def upload_file(): def upload_file():
if request.method == 'POST': if request.method == 'POST':
if 'file' not in request.files: custom_uri = request.form.get('custom_uri', '').strip()
flash('No file part') raw_url = request.form.get('raw_url', '').strip()
return redirect(request.url)
file = request.files['file']
if file.filename == '': if raw_url:
flash('No file selected') # Handle raw URL input
return redirect(request.url) try:
import requests
response = requests.get(raw_url)
if response.status_code == 200:
content = response.text
from io import BytesIO
file = BytesIO(content.encode('utf-8'))
filename = raw_url.split('/')[-1]
if not filename.endswith('.md'):
filename += '.md'
# Create a FileStorage-like object that save_file can handle
from werkzeug.datastructures import FileStorage
file = FileStorage(
stream=file,
filename=filename,
content_type='text/markdown'
)
uri, filename = save_file(file, custom_uri if custom_uri else None)
return redirect(url_for('main.view_file', uri=uri))
else:
flash('Could not fetch content from URL')
return redirect(request.url)
except Exception as e:
flash(f'Error fetching URL: {str(e)}')
return redirect(request.url)
elif 'file' in request.files:
file = request.files['file']
if file and file.filename.endswith('.md'): if file.filename == '':
custom_uri = request.form.get('custom_uri', '').strip() flash('No file selected and no URL provided')
uri, filename = save_file(file, custom_uri if custom_uri else None) return redirect(request.url)
return redirect(url_for('main.view_file', uri=uri))
if file and file.filename.endswith('.md'):
uri, filename = save_file(file, custom_uri if custom_uri else None)
return redirect(url_for('main.view_file', uri=uri))
else:
flash('Only markdown files are allowed')
else: else:
flash('Only markdown files are allowed') flash('Please either upload a file or provide a URL')
return redirect(request.url)
return render_template('upload.html') return render_template('upload.html')

97
app/templates/base.html Normal file
View file

@ -0,0 +1,97 @@
<!DOCTYPE html>
<html>
<head>
{% block head %}
<title>Histogram Viewer</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/digitallytailored/classless@latest/classless.min.css">
<link rel="stylesheet" href="https://esm.sh/@wooorm/starry-night@3/style/both">
<style>
.card {
padding: 1rem;
border-radius: 0.5rem;
background-color: var(--background-color);
color: var(--text-color);
box-shadow: 0 0 8px 0 rgba(0, 0, 0, 0.1);
border-radius: 1rem;
}
.card:hover {
box-shadow: 0 0 8px 0 rgba(0, 0, 0, 0.2);
}
.card-title {
text-decoration: none;
color: var(--text-color);
}
.card-title:hover {
text-decoration: underline;
}
.delete-button {
position: relative;
float: right;
margin: 0;
padding: 0.25rem 0.5rem;
font-size: 0.8rem;
background-color: var(--red);
color: var(--text-color);
border: none;
border-radius: 0.5rem;
cursor: pointer;
}
.container {
display: flex;
flex-direction: column;
gap: 1rem;
max-width: 65%;
margin: 0 auto;
}
</style>
{% endblock %}
<script>
document.addEventListener('DOMContentLoaded', function () {
// Dark mode toggle button
const darkModeToggle = document.getElementById('darkModeToggle');
function setColorScheme(scheme) {
document.documentElement.setAttribute('color-scheme', scheme);
localStorage.setItem('color-scheme', scheme);
}
function getColorScheme() {
let scheme = localStorage.getItem('color-scheme');
if (scheme) {
return scheme;
}
return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
}
setColorScheme(getColorScheme());
darkModeToggle.addEventListener('click', function () {
const newScheme = getColorScheme() === 'dark' ? 'light' : 'dark';
setColorScheme(newScheme);
});
darkModeToggle.checked = getColorScheme() === 'dark';
});
</script>
</head>
<nav>
<a class="glass" href="{{ url_for('main.index') }}">Home</a>
<a class="glass" href="{{ url_for('main.upload_file') }}">Upload</a>
<button class="outline" id="darkModeToggle">Toggle Theme</button>
</nav>
<body>
<div class="container">
{% block content %}
{% endblock %}
</div>
</body>
</html>

View file

@ -1,91 +1,57 @@
<!DOCTYPE html> {% extends "base.html" %}
<html>
<head> {% block content %}
<title>Markdown Viewer</title> <h1>Markdown Viewer</h1>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/digitallytailored/classless@latest/classless.min.css">
<style> <div>
.file-list { <a href="{{ url_for('main.upload_file') }}" class="button">Upload New Document</a>
margin: 2em 0; </div>
}
.file-item { {% if documents %}
display: flex; <div class="container">
justify-content: space-between; <h2>Available Documents</h2>
align-items: center;
padding: 0.75em; {% for doc in documents %}
border-bottom: 1px solid #eee; <div class="card">
} <!-- <div>
.file-item:hover { <a href="{{ url_for('main.view_file', uri=doc.uri) }}" class="card-title">
background-color: #f9f9f9; {{ doc.filename }}
} </a>
.file-link { <span class="file-uri">URI: {{ doc.uri }}</span>
font-weight: bold; </div> -->
text-decoration: none; <div>
} <a href="{{ url_for('main.view_file', uri=doc.uri) }}" class="card-title">
.file-uri { <h3>{{ doc.filename }}</h3>
color: #666; </a>
font-size: 0.9em; <form action="{{ url_for('main.index') }}" method="post">
} <input type="hidden" name="delete_uri" value="{{ doc.uri }}">
.copy-button { <button type="submit" class="delete-button">Delete</button>
background: #f0f0f0; </form>
border: 1px solid #ddd;
padding: 0.25em 0.5em;
border-radius: 4px;
cursor: pointer;
font-size: 0.8em;
}
.empty-state {
text-align: center;
padding: 3em;
background-color: #f9f9f9;
border-radius: 4px;
margin: 2em 0;
}
</style>
</head>
<body>
<h1>Markdown Viewer</h1>
<div class="actions">
<a href="{{ url_for('main.upload_file') }}" class="button">Upload New Document</a>
</div>
{% if documents %}
<div class="file-list">
<h2>Available Documents</h2>
{% for doc in documents %}
<div class="file-item">
<div>
<a href="{{ url_for('main.view_file', uri=doc.uri) }}" class="file-link">
{{ doc.filename }}
</a>
<span class="file-uri">URI: {{ doc.uri }}</span>
</div>
<div> <div>
<a href="{{ url_for('main.view_file', uri=doc.uri) }}" class="button">View</a> <a href="{{ url_for('main.view_file', uri=doc.uri) }}" class="button">View</a>
<button class="copy-button" onclick="copyToClipboard('{{ url_for('main.view_file', uri=doc.uri, _external=True) }}')"> <button class="copy-button"
Copy Link onclick="copyToClipboard('{{ url_for('main.view_file', uri=doc.uri, _external=True) }}')">Copy
</button> Link</button>
</div> </div>
</div> </div>
{% endfor %}
</div> </div>
{% else %} {% endfor %}
<div class="empty-state"> </div>
<h3>No documents available</h3> {% else %}
<p>Upload a markdown file to get started!</p> <div>
<a href="{{ url_for('main.upload_file') }}" class="button">Upload Now</a> <h3>No documents available</h3>
</div> <p>Upload a markdown file to get started!</p>
{% endif %} <a href="{{ url_for('main.upload_file') }}" class="button">Upload Now</a>
</div>
<script> {% endif %}
function copyToClipboard(text) {
navigator.clipboard.writeText(text).then(function() { <script>
alert('Link copied to clipboard!'); function copyToClipboard(text) {
}, function() { navigator.clipboard.writeText(text).then(function () {
alert('Failed to copy link'); alert('Link copied to clipboard!');
}); }, function () {
} alert('Failed to copy link');
</script> });
</body> }
</html> </script>
{% endblock %}

View file

@ -1,39 +1,40 @@
<!DOCTYPE html> {% extends "base.html" %}
<html>
<head> {% block content %}
<title>Upload Markdown File</title> <h1>Upload Markdown File</h1>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/digitallytailored/classless@latest/classless.min.css">
</head> {% with messages = get_flashed_messages() %}
<body> {% if messages %}
<h1>Upload Markdown File</h1> <div class="messages">
{% for message in messages %}
{% with messages = get_flashed_messages() %} <p class="alert">{{ message }}</p>
{% if messages %} {% endfor %}
<div class="messages"> </div>
{% for message in messages %} {% endif %}
<p class="alert">{{ message }}</p> {% endwith %}
{% endfor %}
</div> <form method="post" enctype="multipart/form-data">
{% endif %} <div>
{% endwith %} <label for="file">Select a markdown file:</label>
<input type="file" name="file" id="file" accept=".md">
<form method="post" enctype="multipart/form-data"> </div>
<div>
<label for="file">Select a markdown file:</label> <div>
<input type="file" name="file" id="file" accept=".md"> <label for="raw_url">Or enter a URL:</label>
</div> <input type="url" name="raw_url" id="raw_url" placeholder="https://example.com/markdown-file.md">
</div>
<div>
<label for="custom_uri">Custom URI (optional):</label> <div>
<input type="text" name="custom_uri" id="custom_uri" placeholder="e.g., my-document"> <label for="custom_uri">Custom URI (optional):</label>
<small>Leave blank for an auto-generated URI</small> <input type="text" name="custom_uri" id="custom_uri" placeholder="e.g., my-document">
</div> <small>Leave blank for an auto-generated URI</small>
</div>
<div>
<input type="submit" value="Upload"> <div>
</div> <button class="glass" type="submit">Submit</button>
</form> </div>
</form>
<a href="{{ url_for('main.index') }}">Back to Home</a>
</body> <button class="glass" href="{{ url_for('main.index') }}">Back to Home</button>
</html>
{% endblock %}

View file

@ -1,69 +1,104 @@
<!DOCTYPE html> {% extends "base.html" %}
<html> {% block head %}
<head> {{ super() }}
<title>{{ filename }} - Markdown Viewer</title> <meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/digitallytailored/classless@latest/classless.min.css"> <!-- This supports light and dark mode automatically. -->
<meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="https://esm.sh/@wooorm/starry-night@3/style/both">
<!--<link rel="stylesheet" href="github-markdown.css">--> <link rel="stylesheet" href="github-markdown.css">
<style> <!-- <style>
pre { .markdown-body {
background-color: #f5f5f5; box-sizing: border-box;
padding: 1em; min-width: 200px;
border-radius: 4px; max-width: 980px;
overflow-x: auto; margin: 0 auto;
padding: 45px;
}
@media (max-width: 767px) {
.markdown-body {
padding: 15px;
} }
}
table {
border-collapse: collapse; /* GitHub-style admonitions */
width: 100%; .markdown-alert {
margin: 1em 0; padding: 0.5rem 1rem;
} margin-bottom: 16px;
border-radius: 6px;
table, th, td { }
border: 1px solid #ddd;
} .markdown-alert-title {
font-weight: 600;
th, td { margin-bottom: 8px;
padding: 0.5em; display: flex;
text-align: left; align-items: center;
} }
.document-info { .markdown-alert-title svg {
margin-bottom: 2em; margin-right: 8px;
padding: 1em; }
background-color: #f9f9f9;
border-radius: 4px; .markdown-alert-note {
} border-left: 4px solid #0969da;
.markdown-body { background-color: #ddf4ff;
box-sizing: border-box; }
min-width: 200px;
max-width: 980px; .markdown-alert-tip {
margin: 0 auto; border-left: 4px solid #1a7f37;
padding: 45px; background-color: #dafbe1;
}
.markdown-alert-important {
border-left: 4px solid #9a6700;
background-color: #fff8c5;
}
.markdown-alert-warning {
border-left: 4px solid #9a6700;
background-color: #fff8c5;
}
.markdown-alert-caution {
border-left: 4px solid #cf222e;
background-color: #ffebe9;
}
/* Dark mode support */
@media (prefers-color-scheme: dark) {
.markdown-alert-note {
background-color: rgba(56, 139, 253, 0.15);
} }
@media (max-width: 767px) { .markdown-alert-tip {
.markdown-body { background-color: rgba(46, 160, 67, 0.15);
padding: 15px; }
}
} </style> .markdown-alert-important,
</head> .markdown-alert-warning {
<body> background-color: rgba(187, 128, 9, 0.15);
<div class="document-info"> }
<h1>{{ filename }}</h1>
<p> .markdown-alert-caution {
<strong>Permanent Link:</strong> background-color: rgba(248, 81, 73, 0.15);
<code>{{ url_for('main.view_file', uri=uri, _external=True) }}</code> }
</p> }
</div> </style> -->
{% endblock %}
<div class="content"> {% block content %}
{{ content|safe }} <div class="markdown-body">
</div> <h1>{{ filename }}</h1>
<p>
<div class="actions"> <strong>Permanent Link:</strong>
<a href="{{ url_for('main.upload_file') }}">Upload Another Document</a> | <code>{{ url_for('main.view_file', uri=uri, _external=True) }}</code>
<a href="{{ url_for('main.index') }}">Home</a> </p>
</div> </div>
</body>
</html> <div class="markdown-body">
{{ content|safe }}
</div>
<div>
<button class="glass" href="{{ url_for('main.upload_file') }}">Upload Another Document</button>
<!-- <button class="glass" href="{{ url_for('main.index') }}">Home</button> -->
</div>
{% endblock %}

65
app/utils/utils.py Normal file
View file

@ -0,0 +1,65 @@
import re
from markdown import Markdown
from markdown.extensions import Extension
from markdown.preprocessors import Preprocessor
class GithubAdmonitionPreprocessor(Preprocessor):
ADMONITION_PATTERN = re.compile(r'^!(?P<type>NOTE|TIP|IMPORTANT|WARNING|CAUTION)\s*(?P<title>.*?)$', re.MULTILINE)
def run(self, lines):
new_lines = []
i = 0
while i < len(lines):
line = lines[i]
match = self.ADMONITION_PATTERN.match(line)
if match:
admonition_type = match.group('type').lower()
title = match.group('title').strip()
# Start the div with appropriate classes
new_lines.append(f'<div class="markdown-alert markdown-alert-{admonition_type}">')
# Add the title if provided, otherwise use the type
if title:
new_lines.append(f'<p class="markdown-alert-title"><svg class="octicon" viewBox="0 0 16 16" version="1.1" width="16" height="16"><path d="M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path></svg>{admonition_type.capitalize()}</p>')
else:
new_lines.append(f'<p class="markdown-alert-title"><svg class="octicon" viewBox="0 0 16 16" version="1.1" width="16" height="16"><path d="M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path></svg>{admonition_type.capitalize()}</p>')
# Find the content of the admonition
i += 1
content_lines = []
while i < len(lines) and lines[i].strip() and not self.ADMONITION_PATTERN.match(lines[i]):
content_lines.append(lines[i])
i += 1
# Add content and close the div
if content_lines:
new_lines.append('<p>' + '<br>'.join(content_lines) + '</p>')
new_lines.append('</div>')
# If we reached the end of the content or an empty line, don't increment i again
if i >= len(lines) or not lines[i].strip():
continue
else:
new_lines.append(line)
i += 1
return new_lines
class GithubAdmonitionExtension(Extension):
def extendMarkdown(self, md):
md.preprocessors.register(GithubAdmonitionPreprocessor(md), 'github_admonition', 175)
def convert_markdown_to_html(markdown_text):
# Create Markdown instance with GitHub-style admonitions
md = Markdown(extensions=[
'markdown.extensions.fenced_code',
'markdown.extensions.tables',
'markdown.extensions.nl2br',
GithubAdmonitionExtension(),
# Add other extensions you need
])
# Convert markdown to HTML
html = md.convert(markdown_text)
return html

114
uploads/README.md Normal file
View file

@ -0,0 +1,114 @@
# ReDeploy Docker Application
A lightweight, self-hosted Docker tool to deploy Git-hosted sites locally. Clone, build, and deploy Hugo, Go, or Node.js sites with custom commands, branch selection, and private repo access. Detect changes and auto-redeploy — a flexible alternative to SaaS tools like Cloudflare Pages or GitHub Pages.
## Features
- 🚀 Easy deployment of Hugo sites in Docker containers
- 🔒 Support for both public and private Git repositories
- 🛠 Custom build commands (npm, Hugo, etc.)
- 🌐 Automatic network binding for container access
- 🔄 Flexible command execution with proper error handling
- 🔄 Automatic pulling of the latest changes from the repository
## Prerequisites
- Docker
- Docker Compose
- Git (for building from source)
## Quick Start
### Using Docker Compose
1. Create a `docker-compose.yml` file:
```yaml
services:
redeploy:
image: ghcr.io/pik4li/redeploy:latest
ports:
- "1313:1313"
env_file:
- .env
```
2. Create/Edit the `.env` file (**[available variables](#environment-variables)**):
```bash
# required
REPO=https://github.com/your/hugo/repo # leading https:// is not required!
# optional
BRANCH=main # Optional: for branch selection
GIT_TOKEN="your_github_token" # Optional: for private repositories
COMMAND="npm install && npm run dev" # Optional: custom build command
CHECK_INTERVAL=300 # Optional: interval in seconds to check for updates
```
3. Run the container:
```bash
docker compose up
```
4. Access the site at `http://localhost:1313` or `http://localhost:8080` (if you have a different port)
5. If you have a reverseproxy already running, you can point it to the container's port to have a local cloudflare pages like experience with automatic redeployment.
## Environment Variables
| Variable | Required | Description | Example | Default value |
| -------------- | -------- | --------------------------------------------- | ------------------------------ | ------------------------------------------------ |
| REPO | Yes | URL of the Git repository | `https://github.com/user/repo` | - |
| BRANCH | No | The branch to use for cloning the site | `main` | main |
| GIT_TOKEN | No | Authentication token for private repositories | `ghp_xxxxxxxxxxxx` | - |
| COMMAND | No | Custom build/run command | `npm install && npm run dev` | `hugo server -D --noHTTPCache --disableFastRender` |
| CHECK_INTERVAL | No | Interval in seconds to check for updates | `300` | 300 |
## Custom Commands
The application supports various custom commands that will automatically be configured for proper network binding:
### Command Examples
- `npm install && npm run dev`
- `hugo server -D`
- `hugo server`
- `hugo server -D`
## Docker Compose Examples
### Basic Example with .env file
```yaml
services:
redeploy:
image: ghcr.io/pik4li/redeploy:latest
ports:
- "1313:1313"
env_file:
- .env
```
> [!IMPORTANT]
> The `.env` file is required for the container to work.
> You can find the proper variables in the [Environment Variables](#environment-variables) section.
---
### Example without .env file
```yaml
services:
redeploy:
image: ghcr.io/pik4li/redeploy:latest
ports:
- "1313:1313"
environment:
- REPO="https://github.com/your/hugo/repo"
- GIT_TOKEN="your_github_token"
- COMMAND="npm install && npm run dev"
- CHECK_INTERVAL="10"
```

760
uploads/docker-list.md Normal file
View file

@ -0,0 +1,760 @@
<!DOCTYPE html>
<html lang="en-US" data-theme="forgejo-auto">
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>azubis/docker.md at main - docker/azubis - Jarvis-Git: Beyond coding. We code.</title>
<link rel="manifest" href="data:application/json;base64,eyJuYW1lIjoiSmFydmlzLUdpdCIsInNob3J0X25hbWUiOiJKYXJ2aXMtR2l0Iiwic3RhcnRfdXJsIjoiaHR0cHM6Ly9naXQuazRsaS5kZS8iLCJpY29ucyI6W3sic3JjIjoiaHR0cHM6Ly9naXQuazRsaS5kZS9hc3NldHMvaW1nL2xvZ28ucG5nIiwidHlwZSI6ImltYWdlL3BuZyIsInNpemVzIjoiNTEyeDUxMiJ9LHsic3JjIjoiaHR0cHM6Ly9naXQuazRsaS5kZS9hc3NldHMvaW1nL2xvZ28uc3ZnIiwidHlwZSI6ImltYWdlL3N2Zyt4bWwiLCJzaXplcyI6IjUxMng1MTIifV19">
<meta name="author" content="docker">
<meta name="description" content="azubis">
<meta name="keywords" content="git,forge,forgejo">
<meta name="referrer" content="no-referrer">
<link rel="alternate" type="application/atom+xml" title="" href="/docker/azubis.atom">
<link rel="alternate" type="application/rss+xml" title="" href="/docker/azubis.rss">
<link rel="icon" href="/assets/img/favicon.svg" type="image/svg+xml">
<link rel="alternate icon" href="/assets/img/favicon.png" type="image/png">
<script>
window.addEventListener('error', function(e) {window._globalHandlerErrors=window._globalHandlerErrors||[]; window._globalHandlerErrors.push(e);});
window.addEventListener('unhandledrejection', function(e) {window._globalHandlerErrors=window._globalHandlerErrors||[]; window._globalHandlerErrors.push(e);});
window.config = {
appUrl: 'https:\/\/git.k4li.de\/',
appSubUrl: '',
assetVersionEncoded: encodeURIComponent('10.0.2~gitea-1.22.0'),
assetUrlPrefix: '\/assets',
runModeIsProd: true ,
customEmojis: {"codeberg":":codeberg:","forgejo":":forgejo:","git":":git:","gitea":":gitea:","github":":github:","gitlab":":gitlab:","gogs":":gogs:"},
csrfToken: 'fFb8L0l2pRu0kdXd6Bs839o7fLA6MTc0MjYwMzAzMzI3NzgyNjIxMQ',
pageData: {},
notificationSettings: {"EventSourceUpdateTime":10000,"MaxTimeout":60000,"MinTimeout":10000,"TimeoutStep":10000},
enableTimeTracking: true ,
mermaidMaxSourceCharacters: 5000 ,
i18n: {
copy_success: "Copied!",
copy_error: "Copy failed",
error_occurred: "An error occurred",
network_error: "Network error",
remove_label_str: "Remove item \"%s\"",
modal_confirm: "Confirm",
modal_cancel: "Cancel",
more_items: "More items",
},
};
window.config.pageData = window.config.pageData || {};
</script>
<script src="/assets/js/webcomponents.js?v=10.0.2~gitea-1.22.0"></script>
<noscript>
<style>
.dropdown:hover > .menu { display: block; }
.ui.secondary.menu .dropdown.item > .menu { margin-top: 0; }
</style>
</noscript>
<meta property="og:image" content="https://git.k4li.de/docker/azubis/-/summary-card">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="600">
<meta property="og:image:alt" content="Summary card of repository docker/azubis">
<meta property="og:title" content="azubis/docker.md at main">
<meta property="og:url" content="https://git.k4li.de//docker/azubis/src/branch/main/docker.md">
<meta property="og:type" content="object">
<meta property="og:site_name" content="Jarvis-Git: Beyond coding. We code.">
<link rel="stylesheet" href="/assets/css/index.css?v=10.0.2~gitea-1.22.0">
<link rel="stylesheet" href="/assets/css/theme-forgejo-auto.css?v=10.0.2~gitea-1.22.0">
</head>
<body hx-headers='{"x-csrf-token": "fFb8L0l2pRu0kdXd6Bs839o7fLA6MTc0MjYwMzAzMzI3NzgyNjIxMQ"}' hx-swap="outerHTML" hx-ext="morph" hx-push-url="false">
<div class="full height">
<noscript>This website requires JavaScript.</noscript>
<nav id="navbar" aria-label="Navigation bar">
<div class="navbar-left ui secondary menu">
<a class="item" id="navbar-logo" href="/" aria-label="Home">
<img width="30" height="30" src="/assets/img/logo.svg" alt="Logo" aria-hidden="true">
</a>
<div class="ui secondary menu item navbar-mobile-right only-mobile">
<button class="item tw-w-auto ui icon mini button tw-p-2 tw-m-0" id="navbar-expand-toggle" aria-label="Toggle menu"><svg viewBox="0 0 16 16" class="svg octicon-three-bars" aria-hidden="true" width="16" height="16"><path d="M1 2.75A.75.75 0 0 1 1.75 2h12.5a.75.75 0 0 1 0 1.5H1.75A.75.75 0 0 1 1 2.75m0 5A.75.75 0 0 1 1.75 7h12.5a.75.75 0 0 1 0 1.5H1.75A.75.75 0 0 1 1 7.75M1.75 12h12.5a.75.75 0 0 1 0 1.5H1.75a.75.75 0 0 1 0-1.5"/></svg></button>
</div>
<a class="item" href="/explore/repos">Explore</a>
<a class="item" target="_blank" rel="noopener noreferrer" href="https://forgejo.org/docs/latest/">Help</a>
</div>
<div class="navbar-right ui secondary menu">
<a class="item" rel="nofollow" href="/user/login?redirect_to=%2fdocker%2fazubis%2fsrc%2fbranch%2fmain%2fdocker.md">
<svg viewBox="0 0 16 16" class="svg octicon-sign-in" aria-hidden="true" width="16" height="16"><path d="M2 2.75C2 1.784 2.784 1 3.75 1h2.5a.75.75 0 0 1 0 1.5h-2.5a.25.25 0 0 0-.25.25v10.5c0 .138.112.25.25.25h2.5a.75.75 0 0 1 0 1.5h-2.5A1.75 1.75 0 0 1 2 13.25Zm6.56 4.5h5.69a.75.75 0 0 1 0 1.5H8.56l1.97 1.97a.749.749 0 0 1-.326 1.275.75.75 0 0 1-.734-.215L6.22 8.53a.75.75 0 0 1 0-1.06l3.25-3.25a.749.749 0 0 1 1.275.326.75.75 0 0 1-.215.734Z"/></svg> Sign in
</a>
</div>
</nav>
<div role="main" aria-label="azubis/docker.md at main" class="page-content repository file list ">
<div class="secondary-nav">
<div class="ui container">
<div class="repo-header">
<div class="flex-item tw-items-center">
<div class="flex-item-leading">
<svg viewBox="0 0 16 16" class="svg octicon-repo" aria-hidden="true" width="24" height="24"><path d="M2 2.5A2.5 2.5 0 0 1 4.5 0h8.75a.75.75 0 0 1 .75.75v12.5a.75.75 0 0 1-.75.75h-2.5a.75.75 0 0 1 0-1.5h1.75v-2h-8a1 1 0 0 0-.714 1.7.75.75 0 1 1-1.072 1.05A2.5 2.5 0 0 1 2 11.5Zm10.5-1h-8a1 1 0 0 0-1 1v6.708A2.5 2.5 0 0 1 4.5 9h8ZM5 12.25a.25.25 0 0 1 .25-.25h3.5a.25.25 0 0 1 .25.25v3.25a.25.25 0 0 1-.4.2l-1.45-1.087a.25.25 0 0 0-.3 0L5.4 15.7a.25.25 0 0 1-.4-.2Z"/></svg>
</div>
<div class="flex-item-main">
<div class="flex-item-title gt-font-18">
<a class="muted gt-font-normal" href="/docker">docker</a>/<a class="muted" href="/docker/azubis">azubis</a>
</div>
</div>
<div class="flex-item-trailing">
</div>
</div>
<div class="repo-buttons button-row">
<a class="ui compact small basic button" href="/docker/azubis.rss" data-tooltip-content="RSS feed">
<svg viewBox="0 0 16 16" class="svg octicon-rss" aria-hidden="true" width="16" height="16"><path d="M2.002 2.725a.75.75 0 0 1 .797-.699C8.79 2.42 13.58 7.21 13.974 13.201a.75.75 0 0 1-1.497.098 10.5 10.5 0 0 0-9.776-9.776.747.747 0 0 1-.7-.798ZM2.84 7.05h-.002a7 7 0 0 1 6.113 6.111.75.75 0 0 1-1.49.178 5.5 5.5 0 0 0-4.8-4.8.75.75 0 0 1 .179-1.489M2 13a1 1 0 1 1 2 0 1 1 0 0 1-2 0"/></svg>
</a>
<form hx-boost="true" hx-target="this" method="post" action="/docker/azubis/action/watch">
<div class="ui labeled button" data-tooltip-content="Sign in to watch this repository.">
<button type="submit" class="ui compact small basic button" disabled>
<svg viewBox="0 0 16 16" class="svg octicon-eye" aria-hidden="true" width="16" height="16"><path d="M8 2c1.981 0 3.671.992 4.933 2.078 1.27 1.091 2.187 2.345 2.637 3.023a1.62 1.62 0 0 1 0 1.798c-.45.678-1.367 1.932-2.637 3.023C11.67 13.008 9.981 14 8 14s-3.671-.992-4.933-2.078C1.797 10.83.88 9.576.43 8.898a1.62 1.62 0 0 1 0-1.798c.45-.677 1.367-1.931 2.637-3.022C4.33 2.992 6.019 2 8 2M1.679 7.932a.12.12 0 0 0 0 .136c.411.622 1.241 1.75 2.366 2.717C5.176 11.758 6.527 12.5 8 12.5s2.825-.742 3.955-1.715c1.124-.967 1.954-2.096 2.366-2.717a.12.12 0 0 0 0-.136c-.412-.621-1.242-1.75-2.366-2.717C10.824 4.242 9.473 3.5 8 3.5s-2.825.742-3.955 1.715c-1.124.967-1.954 2.096-2.366 2.717M8 10a2 2 0 1 1-.001-3.999A2 2 0 0 1 8 10"/></svg><span class="text not-mobile">Watch</span>
</button>
<a hx-boost="false" class="ui basic label" href="/docker/azubis/watchers">
1
</a>
</div>
</form>
<form hx-boost="true" hx-target="this" method="post" action="/docker/azubis/action/star">
<div class="ui labeled button" data-tooltip-content="Sign in to star this repository.">
<button type="submit" class="ui compact small basic button" disabled>
<svg viewBox="0 0 16 16" class="svg octicon-star" aria-hidden="true" width="16" height="16"><path d="M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.751.751 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25m0 2.445L6.615 5.5a.75.75 0 0 1-.564.41l-3.097.45 2.24 2.184a.75.75 0 0 1 .216.664l-.528 3.084 2.769-1.456a.75.75 0 0 1 .698 0l2.77 1.456-.53-3.084a.75.75 0 0 1 .216-.664l2.24-2.183-3.096-.45a.75.75 0 0 1-.564-.41z"/></svg><span class="text not-mobile">Star</span>
</button>
<a hx-boost="false" class="ui basic label" href="/docker/azubis/stars">
0
</a>
</div>
</form>
<div class="ui labeled button
disabled
"
data-tooltip-content="Sign in to fork this repository."
>
<a class="ui compact small basic button"
>
<svg viewBox="0 0 16 16" class="svg octicon-repo-forked" aria-hidden="true" width="16" height="16"><path d="M5 5.372v.878c0 .414.336.75.75.75h4.5a.75.75 0 0 0 .75-.75v-.878a2.25 2.25 0 1 1 1.5 0v.878a2.25 2.25 0 0 1-2.25 2.25h-1.5v2.128a2.251 2.251 0 1 1-1.5 0V8.5h-1.5A2.25 2.25 0 0 1 3.5 6.25v-.878a2.25 2.25 0 1 1 1.5 0M5 3.25a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0m6.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5m-3 8.75a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0"/></svg><span class="text not-mobile">Fork</span>
</a>
<div class="ui small modal" id="fork-repo-modal">
<div class="header">
You've already forked azubis
</div>
<div class="content tw-text-left">
<div class="ui list">
</div>
</div>
</div>
<a class="ui basic label" href="/docker/azubis/forks">
0
</a>
</div>
</div>
</div>
</div>
<overflow-menu class="ui container secondary pointing tabular top attached borderless menu tw-pt-0 tw-my-0">
<div class="overflow-menu-items">
<a class="active item" href="/docker/azubis">
<svg viewBox="0 0 16 16" class="svg octicon-code" aria-hidden="true" width="16" height="16"><path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.75.75 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.75.75 0 0 1 .734.215m-6.56 0a.75.75 0 0 1 1.042.018.75.75 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.75.75 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"/></svg> Code
</a>
<a class="item" href="/docker/azubis/issues">
<svg viewBox="0 0 16 16" class="svg octicon-issue-opened" aria-hidden="true" width="16" height="16"><path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3"/><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0M1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0"/></svg> Issues
</a>
<a class="item" href="/docker/azubis/pulls">
<svg viewBox="0 0 16 16" class="svg octicon-git-pull-request" aria-hidden="true" width="16" height="16"><path d="M1.5 3.25a2.25 2.25 0 1 1 3 2.122v5.256a2.251 2.251 0 1 1-1.5 0V5.372A2.25 2.25 0 0 1 1.5 3.25m5.677-.177L9.573.677A.25.25 0 0 1 10 .854V2.5h1A2.5 2.5 0 0 1 13.5 5v5.628a2.251 2.251 0 1 1-1.5 0V5a1 1 0 0 0-1-1h-1v1.646a.25.25 0 0 1-.427.177L7.177 3.427a.25.25 0 0 1 0-.354M3.75 2.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5m0 9.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5m8.25.75a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0"/></svg> Pull requests
</a>
<a href="/docker/azubis/projects" class="item">
<svg viewBox="0 0 16 16" class="svg octicon-project" aria-hidden="true" width="16" height="16"><path d="M1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25V1.75C0 .784.784 0 1.75 0M1.5 1.75v12.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25M11.75 3a.75.75 0 0 1 .75.75v7.5a.75.75 0 0 1-1.5 0v-7.5a.75.75 0 0 1 .75-.75m-8.25.75a.75.75 0 0 1 1.5 0v5.5a.75.75 0 0 1-1.5 0ZM8 3a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 8 3"/></svg> Projects
</a>
<a class="item" href="/docker/azubis/releases">
<svg viewBox="0 0 16 16" class="svg octicon-tag" aria-hidden="true" width="16" height="16"><path d="M1 7.775V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 0 1 0 2.474l-5.026 5.026a1.75 1.75 0 0 1-2.474 0l-6.25-6.25A1.75 1.75 0 0 1 1 7.775m1.5 0c0 .066.026.13.073.177l6.25 6.25a.25.25 0 0 0 .354 0l5.025-5.025a.25.25 0 0 0 0-.354l-6.25-6.25a.25.25 0 0 0-.177-.073H2.75a.25.25 0 0 0-.25.25ZM6 5a1 1 0 1 1 0 2 1 1 0 0 1 0-2"/></svg> Releases
</a>
<a href="/docker/azubis/packages" class="item">
<svg viewBox="0 0 16 16" class="svg octicon-package" aria-hidden="true" width="16" height="16"><path d="m8.878.392 5.25 3.045c.54.314.872.89.872 1.514v6.098a1.75 1.75 0 0 1-.872 1.514l-5.25 3.045a1.75 1.75 0 0 1-1.756 0l-5.25-3.045A1.75 1.75 0 0 1 1 11.049V4.951c0-.624.332-1.201.872-1.514L7.122.392a1.75 1.75 0 0 1 1.756 0M7.875 1.69l-4.63 2.685L8 7.133l4.755-2.758-4.63-2.685a.25.25 0 0 0-.25 0M2.5 5.677v5.372c0 .09.047.171.125.216l4.625 2.683V8.432Zm6.25 8.271 4.625-2.683a.25.25 0 0 0 .125-.216V5.677L8.75 8.432Z"/></svg> Packages
</a>
<a class="item" href="/docker/azubis/wiki">
<svg viewBox="0 0 16 16" class="svg octicon-book" aria-hidden="true" width="16" height="16"><path d="M0 1.75A.75.75 0 0 1 .75 1h4.253c1.227 0 2.317.59 3 1.501A3.74 3.74 0 0 1 11.006 1h4.245a.75.75 0 0 1 .75.75v10.5a.75.75 0 0 1-.75.75h-4.507a2.25 2.25 0 0 0-1.591.659l-.622.621a.75.75 0 0 1-1.06 0l-.622-.621A2.25 2.25 0 0 0 5.258 13H.75a.75.75 0 0 1-.75-.75Zm7.251 10.324.004-5.073-.002-2.253A2.25 2.25 0 0 0 5.003 2.5H1.5v9h3.757a3.75 3.75 0 0 1 1.994.574M8.755 4.75l-.004 7.322a3.75 3.75 0 0 1 1.992-.572H14.5v-9h-3.495a2.25 2.25 0 0 0-2.25 2.25"/></svg> Wiki
</a>
<a class="item" href="/docker/azubis/activity">
<svg viewBox="0 0 16 16" class="svg octicon-pulse" aria-hidden="true" width="16" height="16"><path d="M6 2c.306 0 .582.187.696.471L10 10.731l1.304-3.26A.75.75 0 0 1 12 7h3.25a.75.75 0 0 1 0 1.5h-2.742l-1.812 4.528a.751.751 0 0 1-1.392 0L6 4.77 4.696 8.03A.75.75 0 0 1 4 8.5H.75a.75.75 0 0 1 0-1.5h2.742l1.812-4.529A.75.75 0 0 1 6 2"/></svg> Activity
</a>
<a class="item" href="/docker/azubis/actions">
<svg viewBox="0 0 16 16" class="svg octicon-play" aria-hidden="true" width="16" height="16"><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0M1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0m4.879-2.773 4.264 2.559a.25.25 0 0 1 0 .428l-4.264 2.559A.25.25 0 0 1 6 10.559V5.442a.25.25 0 0 1 .379-.215"/></svg> Actions
</a>
</div>
</overflow-menu>
<div class="ui tabs divider"></div>
</div>
<div class="ui container ">
<div id="flash-message" hx-swap-oob="true"></div>
<div class="repo-button-row">
<div class="tw-flex tw-items-center tw-gap-y-2">
<script type="module">
const data = {
'textReleaseCompare': "Compare",
'textCreateTag': "Create tag %s",
'textCreateBranch': "Create branch %s",
'textCreateBranchFrom': "from \"%s\"",
'textBranches': "Branches",
'textTags': "Tags",
'textDefaultBranchLabel': "default",
'mode': 'branches',
'showBranchesInDropdown': true ,
'searchFieldPlaceholder': 'Filter branch or tag...',
'branchForm': null ,
'disableCreateBranch': true ,
'setAction': null ,
'submitForm': null ,
'viewType': "branch",
'refName': "main",
'commitIdShort': "b31470e4a3",
'tagName': "",
'branchName': "main",
'noTag': null ,
'defaultSelectedRefName': "main",
'repoDefaultBranch': "main",
'enableFeed': true ,
'rssURLPrefix': '\/docker\/azubis/rss/branch/',
'branchURLPrefix': '\/docker\/azubis/src/branch/',
'branchURLSuffix': '/docker.md',
'tagURLPrefix': '\/docker\/azubis/src/tag/',
'tagURLSuffix': '/docker.md',
'repoLink': "/docker/azubis",
'treePath': "docker.md",
'branchNameSubURL': "branch/main",
'noResults': "No results found.",
};
window.config.pageData.branchDropdownDataList = window.config.pageData.branchDropdownDataList || [];
window.config.pageData.branchDropdownDataList.push(data);
</script>
<div class="js-branch-tag-selector tw-mr-1">
<div class="ui dropdown custom">
<button class="branch-dropdown-button gt-ellipsis ui basic small compact button tw-flex tw-m-0">
<span class="text tw-flex tw-items-center tw-mr-1 gt-ellipsis">
<svg viewBox="0 0 16 16" class="svg octicon-git-branch" aria-hidden="true" width="16" height="16"><path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.5 2.5 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25m-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0m8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5M4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5"/></svg>
<strong ref="dropdownRefName" class="tw-ml-2 tw-inline-block gt-ellipsis">main</strong>
</span>
<svg viewBox="0 0 16 16" class="dropdown icon svg octicon-triangle-down" aria-hidden="true" width="14" height="14"><path d="m4.427 7.427 3.396 3.396a.25.25 0 0 0 .354 0l3.396-3.396A.25.25 0 0 0 11.396 7H4.604a.25.25 0 0 0-.177.427"/></svg>
</button>
</div>
</div>
<a id="new-pull-request" role="button" class="ui compact basic button" href="/docker/azubis/compare/main...main"
data-tooltip-content="Compare">
<svg viewBox="0 0 16 16" class="svg octicon-git-pull-request" aria-hidden="true" width="16" height="16"><path d="M1.5 3.25a2.25 2.25 0 1 1 3 2.122v5.256a2.251 2.251 0 1 1-1.5 0V5.372A2.25 2.25 0 0 1 1.5 3.25m5.677-.177L9.573.677A.25.25 0 0 1 10 .854V2.5h1A2.5 2.5 0 0 1 13.5 5v5.628a2.251 2.251 0 1 1-1.5 0V5a1 1 0 0 0-1-1h-1v1.646a.25.25 0 0 1-.427.177L7.177 3.427a.25.25 0 0 1 0-.354M3.75 2.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5m0 9.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5m8.25.75a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0"/></svg>
</a>
<span class="breadcrumb repo-path tw-ml-1">
<a class="section" href="/docker/azubis/src/branch/main" title="azubis">azubis</a><span class="breadcrumb-divider">/</span><span class="active section" title="docker.md">docker.md</span>
<button class="btn interact-fg tw-p-2" data-clipboard-text="docker.md" data-tooltip-content="Copy path"><svg viewBox="0 0 16 16" class="svg octicon-copy" aria-hidden="true" width="14" height="14"><path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"/><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"/></svg></button></span>
</div>
<div class="tw-flex tw-items-center">
</div>
</div>
<div class="tab-size-4 non-diff-file-content">
<div id="repo-file-commit-box" class="ui segment list-header tw-mb-4 tw-flex tw-justify-between">
<div class="latest-commit">
<img loading="lazy" class="ui avatar tw-align-middle tw-mr-2" src="/assets/img/avatar_default.png" title="Alexander Pieck" width="24" height="24"/>
<span class="author-wrapper" title="Alexander Pieck"><strong>Alexander Pieck</strong></span>
<a rel="nofollow" class="ui sha label " href="/docker/azubis/commit/b31470e4a3058b507ce26924f94bd1d7b9eb7bd4">
<span class="shortsha">b31470e4a3</span>
</a>
<span class="grey commit-summary" title="Add docker.md"><span class="message-wrapper"><a href="/docker/azubis/commit/b31470e4a3058b507ce26924f94bd1d7b9eb7bd4" class="default-link muted">Add docker.md</a></span>
</span>
</div>
<div class="text grey age">
<relative-time prefix="" tense="past" datetime="2025-03-21T09:34:05Z" data-tooltip-content data-tooltip-interactive="true">2025-03-21 09:34:05 +00:00</relative-time>
</div>
</div>
<h4 class="file-header ui top attached header tw-flex tw-items-center tw-justify-between tw-flex-wrap">
<div class="file-header-left tw-flex tw-items-center tw-py-2 tw-pr-4">
<div class="file-info tw-font-mono">
<div class="file-info-entry">
3.7 KiB
</div>
</div>
</div>
<div class="file-header-right file-actions tw-flex tw-items-center tw-flex-wrap">
<div class="ui compact icon buttons">
<a href="?display=source" class="ui mini basic button " data-tooltip-content="View source"><svg viewBox="0 0 16 16" class="svg octicon-code" aria-hidden="true" width="15" height="15"><path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.75.75 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.75.75 0 0 1 .734.215m-6.56 0a.75.75 0 0 1 1.042.018.75.75 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.75.75 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"/></svg></a>
<a href="/docker/azubis/src/branch/main/docker.md" class="ui mini basic button active" data-tooltip-content="View rendered"><svg viewBox="0 0 16 16" class="svg octicon-file" aria-hidden="true" width="15" height="15"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914z"/></svg></a>
</div>
<div class="ui buttons tw-mr-1">
<a class="ui mini basic button" href="/docker/azubis/raw/branch/main/docker.md">Raw</a>
<a class="ui mini basic button" href="/docker/azubis/src/commit/b31470e4a3058b507ce26924f94bd1d7b9eb7bd4/docker.md">Permalink</a>
<a class="ui mini basic button" href="/docker/azubis/blame/branch/main/docker.md">Blame</a>
<a class="ui mini basic button" href="/docker/azubis/commits/branch/main/docker.md">History</a>
</div>
<a download href="/docker/azubis/raw/branch/main/docker.md"><span class="btn-octicon" data-tooltip-content="Download file"><svg viewBox="0 0 16 16" class="svg octicon-download" aria-hidden="true" width="16" height="16"><path d="M2.75 14A1.75 1.75 0 0 1 1 12.25v-2.5a.75.75 0 0 1 1.5 0v2.5c0 .138.112.25.25.25h10.5a.25.25 0 0 0 .25-.25v-2.5a.75.75 0 0 1 1.5 0v2.5A1.75 1.75 0 0 1 13.25 14Z"/><path d="M7.25 7.689V2a.75.75 0 0 1 1.5 0v5.689l1.97-1.969a.749.749 0 1 1 1.06 1.06l-3.25 3.25a.75.75 0 0 1-1.06 0L4.22 6.78a.749.749 0 1 1 1.06-1.06z"/></svg></span></a>
<a href="#" id="copy-content" class="btn-octicon " data-link="/docker/azubis/raw/branch/main/docker.md" data-tooltip-content="Copy content"><svg viewBox="0 0 16 16" class="svg octicon-copy" aria-hidden="true" width="14" height="14"><path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"/><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"/></svg></a>
<a class="btn-octicon" href="/docker/azubis/rss/branch/main/docker.md" data-tooltip-content="RSS feed">
<svg viewBox="0 0 16 16" class="svg octicon-rss" aria-hidden="true" width="14" height="14"><path d="M2.002 2.725a.75.75 0 0 1 .797-.699C8.79 2.42 13.58 7.21 13.974 13.201a.75.75 0 0 1-1.497.098 10.5 10.5 0 0 0-9.776-9.776.747.747 0 0 1-.7-.798ZM2.84 7.05h-.002a7 7 0 0 1 6.113 6.111.75.75 0 0 1-1.49.178 5.5 5.5 0 0 0-4.8-4.8.75.75 0 0 1 .179-1.489M2 13a1 1 0 1 1 2 0 1 1 0 0 1-2 0"/></svg>
</a>
<span class="btn-octicon disabled" data-tooltip-content="You must fork this repository to make or propose changes to this file."><svg viewBox="0 0 16 16" class="svg octicon-pencil" aria-hidden="true" width="16" height="16"><path d="M11.013 1.427a1.75 1.75 0 0 1 2.474 0l1.086 1.086a1.75 1.75 0 0 1 0 2.474l-8.61 8.61c-.21.21-.47.364-.756.445l-3.251.93a.75.75 0 0 1-.927-.928l.929-3.25c.081-.286.235-.547.445-.758l8.61-8.61Zm.176 4.823L9.75 4.81l-6.286 6.287a.25.25 0 0 0-.064.108l-.558 1.953 1.953-.558a.25.25 0 0 0 .108-.064Zm1.238-3.763a.25.25 0 0 0-.354 0L10.811 3.75l1.439 1.44 1.263-1.263a.25.25 0 0 0 0-.354Z"/></svg></span>
<span class="btn-octicon disabled" data-tooltip-content="You must have write access to make or propose changes to this file."><svg viewBox="0 0 16 16" class="svg octicon-trash" aria-hidden="true" width="16" height="16"><path d="M11 1.75V3h2.25a.75.75 0 0 1 0 1.5H2.75a.75.75 0 0 1 0-1.5H5V1.75C5 .784 5.784 0 6.75 0h2.5C10.216 0 11 .784 11 1.75M4.496 6.675l.66 6.6a.25.25 0 0 0 .249.225h5.19a.25.25 0 0 0 .249-.225l.66-6.6a.75.75 0 0 1 1.492.149l-.66 6.6A1.75 1.75 0 0 1 10.595 15h-5.19a1.75 1.75 0 0 1-1.741-1.575l-.66-6.6a.75.75 0 1 1 1.492-.15M6.5 1.75V3h3V1.75a.25.25 0 0 0-.25-.25h-2.5a.25.25 0 0 0-.25.25"/></svg></span>
</div>
</h4>
<div class="ui bottom attached table unstackable segment">
<div class="file-view markup markdown">
<h1 id="user-content-nice-containers-for-beginners" dir="auto">Nice containers for beginners</h1>
<h4 id="user-content-quellen" dir="auto"><strong>Quellen</strong></h4>
<ul dir="auto">
<li><a href="https://selfh.st/apps/" rel="nofollow">selfh.st</a> &lt;- viele opensource projekte (einige davon dockerized)</li>
<li><a href="https://github.com/veggiemonk/awesome-docker" rel="nofollow">Awesome Docker</a></li>
</ul>
<h2 id="user-content-reverseproxies" dir="auto"><strong>Reverseproxies:</strong></h2>
<blockquote class="attention-header attention-tip"><p class="attention-title" dir="auto"><svg viewbox="0 0 16 16" class="attention-icon attention-tip svg octicon-light-bulb" aria-hidden="true" width="16" height="16"><path d="M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a9 9 0 0 0-.542-.68q-.126-.149-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259q-.142.172-.268.319c-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848q.113-.133.213-.253c.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75M5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5M6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75"></path></svg><strong class="attention-tip">Tip</strong></p>
<p dir="auto">Hier wird zumindest einer benötigt, um SSL-Verschlüsselung und HTTPS auf den Websites zu aktivieren Caddy ist zwar an sich einfacher, weil es nur eine einzige config datei hat, aber zum lernen würde ich den nginxproxymanager empfehlen, da er eine kleine webui hat und man das konzept so gut lernen und verstehen kann</p>
</blockquote>
<ul dir="auto">
<li><a href="https://nginxproxymanager.com/guide/" rel="nofollow">Nginx Reverseproxy-Manager</a></li>
<li><a href="https://hub.docker.com/_/caddy/" rel="nofollow">Caddy</a></li>
</ul>
<h2 id="user-content-dashboards" dir="auto"><strong>Dashboards:</strong></h2>
<blockquote>
<p dir="auto">Pick whatever you like. Homepage wird in einer config datei (yml) konfiguriert. Daher würde ich Dashy oder Flame eher für den Anfang empfehlen</p>
</blockquote>
<ul dir="auto">
<li><a href="https://github.com/Lissy93/dashy" rel="nofollow">Dashy</a></li>
<li><a href="https://github.com/pawelmalak/flame" rel="nofollow">Flame</a></li>
<li><a href="https://gethomepage.dev/" rel="nofollow">Homepage</a></li>
</ul>
<h2 id="user-content-dns" dir="auto"><strong>DNS</strong></h2>
<ul dir="auto">
<li><a href="https://docs.pi-hole.net/docker/" rel="nofollow">PiHole</a></li>
<li><a href="https://github.com/AdguardTeam/AdGuardHome#getting-started" rel="nofollow">AdGuardHome</a></li>
</ul>
<h2 id="user-content-documentation-wikis" dir="auto"><strong>Documentation (Wikis)</strong></h2>
<blockquote class="attention-header attention-tip"><p class="attention-title" dir="auto"><svg viewbox="0 0 16 16" class="attention-icon attention-tip svg octicon-light-bulb" aria-hidden="true" width="16" height="16"><path d="M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a9 9 0 0 0-.542-.68q-.126-.149-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259q-.142.172-.268.319c-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848q.113-.133.213-.253c.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75M5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5M6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75"></path></svg><strong class="attention-tip">Tip</strong></p>
<p dir="auto">Markdown sollte hierbei ein Begriff sein. Einfach zu lernen mit vielen starken optionen zum styling</p>
</blockquote>
<ul dir="auto">
<li><a href="https://www.usememos.com/" rel="nofollow">Memos</a> &lt;- Einfach memos</li>
<li><a href="https://docmost.com/" rel="nofollow">DocMost</a></li>
<li><a href="https://github.com/linuxserver/docker-bookstack" rel="nofollow">BookStack</a></li>
</ul>
<h2 id="user-content-document-management" dir="auto"><strong>Document-Management:</strong></h2>
<blockquote>
<p dir="auto">filebrowser und mydrive sind zwei sehr einfache file share services, die mit einer schönen kleinen Weboberfläche kommen
Nextcloud ist etwas mächtiger, zwar auch deutlich hübscher und mit Android/iOS app etc. Aber eben auch etwas komplexer. Ist aber machbar
PaperlessNGX ist ein Dokumentenspeichersystem, hauptsächlich für pdf dateien. Ich lasse mir dort täglich und regelmäßig aus meinen Mailpostfächern die .pdf Dateien, die als Rechnung deklariert sind automatisch in mein System einspielen. Automatisierungstechnisch ein Traum!</p>
</blockquote>
<ul dir="auto">
<li>
<p dir="auto"><a href="https://github.com/hurlenko/filebrowser-docker" rel="nofollow">filebrowser</a></p>
</li>
<li>
<p dir="auto"><a href="https://github.com/subnub/myDrive" rel="nofollow">my-drive</a></p>
</li>
<li>
<p dir="auto"><a href="https://hub.docker.com/_/nextcloud" rel="nofollow">nextcloud</a></p>
</li>
<li>
<p dir="auto"><a href="https://docs.paperless-ngx.com/setup/#docker" rel="nofollow">PaperlessNGX</a></p>
</li>
<li>
<p dir="auto"><a href="https://immich.app/docs/install/docker-compose" rel="nofollow">Immich</a> &lt;- google photos clone, für zuhause! (Bessere Suchfunktion, Personenerkennung, Geodaten auf einer Map...)</p>
</li>
</ul>
<h2 id="user-content-git" dir="auto"><strong>Git</strong></h2>
<ul dir="auto">
<li><a href="https://docs.gitea.com/next/installation/install-with-docker" rel="nofollow">GiTea</a> &lt;- Ressourceneffizienteste Option || Basis Funktionen</li>
<li><a href="https://onedev.io/" rel="nofollow">OneDev</a> &lt;- Eher für DevOps gedacht, direkte CI/CD integration</li>
<li><a href="https://docs.gitlab.com/install/docker/" rel="nofollow">GitLab</a> &lt;- Business option, meiner Meinung nach das hübscheste, allerdings auch das ressourcenintensivste</li>
</ul>
<h2 id="user-content-sonstige" dir="auto"><strong>Sonstige</strong></h2>
<h3 id="user-content-passwormanager" dir="auto"><strong>Passwormanager</strong></h3>
<ul dir="auto">
<li><a href="https://github.com/dani-garcia/vaultwarden" rel="nofollow">vaultwarden</a> &lt;- das ist vaultwarden. Bitwarden + ohne zu Zahlen ^^</li>
</ul>
<h3 id="user-content-docker-helpers" dir="auto"><strong>docker helpers</strong></h3>
<ul dir="auto">
<li><a href="https://crazymax.dev/diun/" rel="nofollow">diun</a> &lt;- UpdateCheker with push notifications</li>
<li><a href="https://dozzle.dev/" rel="nofollow">doozle</a> &lt;- docker dashboard for log and error management</li>
</ul>
<h3 id="user-content-notifications" dir="auto"><strong>notifications</strong></h3>
<ul dir="auto">
<li><a href="https://ntfy.sh/" rel="nofollow">ntfy</a> &lt;- ich nutze diun in kombination mit ntfy, um genau zu wissen, wann neue updates verfügbar sind
<blockquote>
<p dir="auto">ntfy benachrichtigt mich auch <em><em>IMMER</em></em> wenn per ssh ein login stattfindet, somit weiß ich SOFORT wenn etwas nicht stimmt, und jemand sich ohne mein wissen einloggt</p>
</blockquote>
</li>
</ul>
<h3 id="user-content-plug-and-play" dir="auto"><strong>plug and play</strong></h3>
<ul dir="auto">
<li><a href="https://github.com/benbusby/whoogle-search" rel="nofollow">Whoogle</a> &lt;- Selbst gehostetes und privates google-frontend</li>
<li><a href="https://hub.docker.com/r/excalidraw/excalidraw" rel="nofollow">Excalidraw</a></li>
<li><a href="https://github.com/Stirling-Tools/Stirling-PDF" rel="nofollow">PDF-Tools</a> &lt;- Alles rund um pdf themen</li>
<li><a href="https://github.com/CorentinTh/it-tools" rel="nofollow">IT-Tools</a> &lt;- Geile it-tools, gerne hier mal anschauen <a href="https://it-tools.k4li.de/" rel="nofollow">Mein IT-Tools</a></li>
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
<footer class="page-footer" role="group" aria-label="Footer">
<div class="left-links" role="contentinfo" aria-label="About this software">
<a target="_blank" rel="noopener noreferrer" href="https://forgejo.org">Powered by Forgejo</a>
Version:
10.0.2
Page: <strong>51ms</strong>
Template: <strong>3ms</strong>
</div>
<div class="right-links" role="group" aria-label="Links">
<div class="ui dropdown upward language">
<span class="flex-text-inline"><svg viewBox="0 0 16 16" class="svg octicon-globe" aria-hidden="true" width="14" height="14"><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0M5.78 8.75a9.64 9.64 0 0 0 1.363 4.177q.383.64.857 1.215c.245-.296.551-.705.857-1.215A9.64 9.64 0 0 0 10.22 8.75Zm4.44-1.5a9.64 9.64 0 0 0-1.363-4.177c-.307-.51-.612-.919-.857-1.215a10 10 0 0 0-.857 1.215A9.64 9.64 0 0 0 5.78 7.25Zm-5.944 1.5H1.543a6.51 6.51 0 0 0 4.666 5.5q-.184-.271-.352-.552c-.715-1.192-1.437-2.874-1.581-4.948m-2.733-1.5h2.733c.144-2.074.866-3.756 1.58-4.948q.18-.295.353-.552a6.51 6.51 0 0 0-4.666 5.5m10.181 1.5c-.144 2.074-.866 3.756-1.58 4.948q-.18.296-.353.552a6.51 6.51 0 0 0 4.666-5.5Zm2.733-1.5a6.51 6.51 0 0 0-4.666-5.5q.184.272.353.552c.714 1.192 1.436 2.874 1.58 4.948Z"/></svg> English</span>
<div class="menu language-menu">
<a lang="id-ID" data-url="/?lang=id-ID" class="item ">Bahasa Indonesia</a>
<a lang="de-DE" data-url="/?lang=de-DE" class="item ">Deutsch</a>
<a lang="en-US" data-url="/?lang=en-US" class="item active selected">English</a>
<a lang="es-ES" data-url="/?lang=es-ES" class="item ">Español</a>
<a lang="eo" data-url="/?lang=eo" class="item ">Esperanto</a>
<a lang="fil" data-url="/?lang=fil" class="item ">Filipino</a>
<a lang="fr-FR" data-url="/?lang=fr-FR" class="item ">Français</a>
<a lang="it-IT" data-url="/?lang=it-IT" class="item ">Italiano</a>
<a lang="lv-LV" data-url="/?lang=lv-LV" class="item ">Latviešu</a>
<a lang="hu-HU" data-url="/?lang=hu-HU" class="item ">Magyar nyelv</a>
<a lang="nl-NL" data-url="/?lang=nl-NL" class="item ">Nederlands</a>
<a lang="nds" data-url="/?lang=nds" class="item ">Plattdüütsch</a>
<a lang="pl-PL" data-url="/?lang=pl-PL" class="item ">Polski</a>
<a lang="pt-PT" data-url="/?lang=pt-PT" class="item ">Português de Portugal</a>
<a lang="pt-BR" data-url="/?lang=pt-BR" class="item ">Português do Brasil</a>
<a lang="sl" data-url="/?lang=sl" class="item ">Slovenščina</a>
<a lang="fi-FI" data-url="/?lang=fi-FI" class="item ">Suomi</a>
<a lang="sv-SE" data-url="/?lang=sv-SE" class="item ">Svenska</a>
<a lang="tr-TR" data-url="/?lang=tr-TR" class="item ">Türkçe</a>
<a lang="cs-CZ" data-url="/?lang=cs-CZ" class="item ">Čeština</a>
<a lang="el-GR" data-url="/?lang=el-GR" class="item ">Ελληνικά</a>
<a lang="bg" data-url="/?lang=bg" class="item ">Български</a>
<a lang="ru-RU" data-url="/?lang=ru-RU" class="item ">Русский</a>
<a lang="uk-UA" data-url="/?lang=uk-UA" class="item ">Українська</a>
<a lang="fa-IR" data-url="/?lang=fa-IR" class="item ">فارسی</a>
<a lang="ja-JP" data-url="/?lang=ja-JP" class="item ">日本語</a>
<a lang="zh-CN" data-url="/?lang=zh-CN" class="item ">简体中文</a>
<a lang="zh-TW" data-url="/?lang=zh-TW" class="item ">繁體中文(台灣)</a>
<a lang="zh-HK" data-url="/?lang=zh-HK" class="item ">繁體中文(香港)</a>
<a lang="ko-KR" data-url="/?lang=ko-KR" class="item ">한국어</a>
</div>
</div>
<a href="/assets/licenses.txt">Licenses</a>
<a href="/api/swagger">API</a>
</div>
</footer>
<script src="/assets/js/index.js?v=10.0.2~gitea-1.22.0" onerror="alert('Failed to load asset files from ' + this.src + '. Please make sure the asset files can be accessed.')"></script>
</body>
</html>

78
uploads/docker.md Normal file
View file

@ -0,0 +1,78 @@
# Nice containers for beginners
#### **Quellen**
- [selfh.st](https://selfh.st/apps/) <- viele opensource projekte (einige davon dockerized)
- [Awesome Docker](https://github.com/veggiemonk/awesome-docker)
## **Reverseproxies:**
> [!TIP]
> Hier wird zumindest einer benötigt, um SSL-Verschlüsselung und HTTPS auf den Websites zu aktivieren Caddy ist zwar an sich einfacher, weil es nur eine einzige config datei hat, aber zum lernen würde ich den nginxproxymanager empfehlen, da er eine kleine webui hat und man das konzept so gut lernen und verstehen kann
- [Nginx Reverseproxy-Manager](https://nginxproxymanager.com/guide/)
- [Caddy](https://hub.docker.com/_/caddy/)
## **Dashboards:**
> Pick whatever you like. Homepage wird in einer config datei (yml) konfiguriert. Daher würde ich Dashy oder Flame eher für den Anfang empfehlen
- [Dashy](https://github.com/Lissy93/dashy)
- [Flame](https://github.com/pawelmalak/flame)
- [Homepage](https://gethomepage.dev/)
## **DNS**
- [PiHole](https://docs.pi-hole.net/docker/)
- [AdGuardHome](https://github.com/AdguardTeam/AdGuardHome#getting-started)
## **Documentation (Wikis)**
> [!TIP]
> Markdown sollte hierbei ein Begriff sein. Einfach zu lernen mit vielen starken optionen zum styling
- [Memos](https://www.usememos.com/) <- Einfach memos
- [DocMost](https://docmost.com/)
- [BookStack](https://github.com/linuxserver/docker-bookstack)
## **Document-Management:**
> filebrowser und mydrive sind zwei sehr einfache file share services, die mit einer schönen kleinen Weboberfläche kommen
> Nextcloud ist etwas mächtiger, zwar auch deutlich hübscher und mit Android/iOS app etc. Aber eben auch etwas komplexer. Ist aber machbar
> PaperlessNGX ist ein Dokumentenspeichersystem, hauptsächlich für pdf dateien. Ich lasse mir dort täglich und regelmäßig aus meinen Mailpostfächern die .pdf Dateien, die als Rechnung deklariert sind automatisch in mein System einspielen. Automatisierungstechnisch ein Traum!
- [filebrowser](https://github.com/hurlenko/filebrowser-docker)
- [my-drive](https://github.com/subnub/myDrive)
- [nextcloud](https://hub.docker.com/_/nextcloud)
- [PaperlessNGX](https://docs.paperless-ngx.com/setup/#docker)
- [Immich](https://immich.app/docs/install/docker-compose) <- google photos clone, für zuhause! (Bessere Suchfunktion, Personenerkennung, Geodaten auf einer Map...)
## **Git**
- [GiTea](https://docs.gitea.com/next/installation/install-with-docker) <- Ressourceneffizienteste Option || Basis Funktionen
- [OneDev](https://onedev.io/) <- Eher für DevOps gedacht, direkte CI/CD integration
- [GitLab](https://docs.gitlab.com/install/docker/) <- Business option, meiner Meinung nach das hübscheste, allerdings auch das ressourcenintensivste
## **Sonstige**
### **Passwormanager**
- [vaultwarden](https://github.com/dani-garcia/vaultwarden) <- das ist vaultwarden. Bitwarden + ohne zu Zahlen ^^
### **docker helpers**
- [diun](https://crazymax.dev/diun/) <- UpdateCheker with push notifications
- [doozle](https://dozzle.dev/) <- docker dashboard for log and error management
### **notifications**
- [ntfy](https://ntfy.sh/) <- ich nutze diun in kombination mit ntfy, um genau zu wissen, wann neue updates verfügbar sind
> ntfy benachrichtigt mich auch _*IMMER*_ wenn per ssh ein login stattfindet, somit weiß ich SOFORT wenn etwas nicht stimmt, und jemand sich ohne mein wissen einloggt
### **plug and play**
- [Whoogle](https://github.com/benbusby/whoogle-search) <- Selbst gehostetes und privates google-frontend
- [Excalidraw](https://hub.docker.com/r/excalidraw/excalidraw)
- [PDF-Tools](https://github.com/Stirling-Tools/Stirling-PDF) <- Alles rund um pdf themen
- [IT-Tools](https://github.com/CorentinTh/it-tools) <- Geile it-tools, gerne hier mal anschauen [Mein IT-Tools](https://it-tools.k4li.de/)

1
uploads/uri_map.json Normal file
View file

@ -0,0 +1 @@
{}