addet some features
This commit is contained in:
parent
0861ae20c3
commit
97e3262506
11 changed files with 1369 additions and 208 deletions
3
.gitignore
vendored
3
.gitignore
vendored
|
@ -1,4 +1,5 @@
|
|||
app/routes/__pycache__
|
||||
app/utils/__pycache__
|
||||
app/__pycache__
|
||||
uploads/
|
||||
uploads/classless.html
|
||||
classless.html
|
||||
|
|
|
@ -1,11 +1,24 @@
|
|||
from flask import Blueprint, render_template, request, current_app, redirect, url_for, abort, flash
|
||||
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.route('/', methods=['GET'])
|
||||
@main_bp.route('/', methods=['GET', 'POST'])
|
||||
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
|
||||
uri_map = load_uri_map()
|
||||
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'])
|
||||
def upload_file():
|
||||
if request.method == 'POST':
|
||||
if 'file' not in request.files:
|
||||
flash('No file part')
|
||||
return redirect(request.url)
|
||||
custom_uri = request.form.get('custom_uri', '').strip()
|
||||
raw_url = request.form.get('raw_url', '').strip()
|
||||
|
||||
file = request.files['file']
|
||||
if raw_url:
|
||||
# Handle raw URL input
|
||||
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)
|
||||
|
||||
if file.filename == '':
|
||||
flash('No file selected')
|
||||
return redirect(request.url)
|
||||
elif 'file' in request.files:
|
||||
file = request.files['file']
|
||||
|
||||
if file and file.filename.endswith('.md'):
|
||||
custom_uri = request.form.get('custom_uri', '').strip()
|
||||
uri, filename = save_file(file, custom_uri if custom_uri else None)
|
||||
return redirect(url_for('main.view_file', uri=uri))
|
||||
if file.filename == '':
|
||||
flash('No file selected and no URL provided')
|
||||
return redirect(request.url)
|
||||
|
||||
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:
|
||||
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')
|
||||
|
||||
|
|
97
app/templates/base.html
Normal file
97
app/templates/base.html
Normal 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>
|
|
@ -1,91 +1,57 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Markdown Viewer</title>
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/digitallytailored/classless@latest/classless.min.css">
|
||||
<style>
|
||||
.file-list {
|
||||
margin: 2em 0;
|
||||
}
|
||||
.file-item {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding: 0.75em;
|
||||
border-bottom: 1px solid #eee;
|
||||
}
|
||||
.file-item:hover {
|
||||
background-color: #f9f9f9;
|
||||
}
|
||||
.file-link {
|
||||
font-weight: bold;
|
||||
text-decoration: none;
|
||||
}
|
||||
.file-uri {
|
||||
color: #666;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
.copy-button {
|
||||
background: #f0f0f0;
|
||||
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>
|
||||
{% extends "base.html" %}
|
||||
|
||||
<div class="actions">
|
||||
<a href="{{ url_for('main.upload_file') }}" class="button">Upload New Document</a>
|
||||
</div>
|
||||
{% block content %}
|
||||
<h1>Markdown Viewer</h1>
|
||||
|
||||
{% if documents %}
|
||||
<div class="file-list">
|
||||
<h2>Available Documents</h2>
|
||||
<div>
|
||||
<a href="{{ url_for('main.upload_file') }}" class="button">Upload New Document</a>
|
||||
</div>
|
||||
|
||||
{% 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>
|
||||
{% if documents %}
|
||||
<div class="container">
|
||||
<h2>Available Documents</h2>
|
||||
|
||||
{% for doc in documents %}
|
||||
<div class="card">
|
||||
<!-- <div>
|
||||
<a href="{{ url_for('main.view_file', uri=doc.uri) }}" class="card-title">
|
||||
{{ doc.filename }}
|
||||
</a>
|
||||
<span class="file-uri">URI: {{ doc.uri }}</span>
|
||||
</div> -->
|
||||
<div>
|
||||
<a href="{{ url_for('main.view_file', uri=doc.uri) }}" class="card-title">
|
||||
<h3>{{ doc.filename }}</h3>
|
||||
</a>
|
||||
<form action="{{ url_for('main.index') }}" method="post">
|
||||
<input type="hidden" name="delete_uri" value="{{ doc.uri }}">
|
||||
<button type="submit" class="delete-button">Delete</button>
|
||||
</form>
|
||||
<div>
|
||||
<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) }}')">
|
||||
Copy Link
|
||||
</button>
|
||||
<button class="copy-button"
|
||||
onclick="copyToClipboard('{{ url_for('main.view_file', uri=doc.uri, _external=True) }}')">Copy
|
||||
Link</button>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="empty-state">
|
||||
<h3>No documents available</h3>
|
||||
<p>Upload a markdown file to get started!</p>
|
||||
<a href="{{ url_for('main.upload_file') }}" class="button">Upload Now</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% else %}
|
||||
<div>
|
||||
<h3>No documents available</h3>
|
||||
<p>Upload a markdown file to get started!</p>
|
||||
<a href="{{ url_for('main.upload_file') }}" class="button">Upload Now</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<script>
|
||||
function copyToClipboard(text) {
|
||||
navigator.clipboard.writeText(text).then(function() {
|
||||
alert('Link copied to clipboard!');
|
||||
}, function() {
|
||||
alert('Failed to copy link');
|
||||
});
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
<script>
|
||||
function copyToClipboard(text) {
|
||||
navigator.clipboard.writeText(text).then(function () {
|
||||
alert('Link copied to clipboard!');
|
||||
}, function () {
|
||||
alert('Failed to copy link');
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{% endblock %}
|
|
@ -1,39 +1,40 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Upload Markdown File</title>
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/digitallytailored/classless@latest/classless.min.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1>Upload Markdown File</h1>
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% with messages = get_flashed_messages() %}
|
||||
{% if messages %}
|
||||
<div class="messages">
|
||||
{% for message in messages %}
|
||||
<p class="alert">{{ message }}</p>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endwith %}
|
||||
{% block content %}
|
||||
<h1>Upload Markdown File</h1>
|
||||
|
||||
<form method="post" enctype="multipart/form-data">
|
||||
<div>
|
||||
<label for="file">Select a markdown file:</label>
|
||||
<input type="file" name="file" id="file" accept=".md">
|
||||
</div>
|
||||
{% with messages = get_flashed_messages() %}
|
||||
{% if messages %}
|
||||
<div class="messages">
|
||||
{% for message in messages %}
|
||||
<p class="alert">{{ message }}</p>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endwith %}
|
||||
|
||||
<div>
|
||||
<label for="custom_uri">Custom URI (optional):</label>
|
||||
<input type="text" name="custom_uri" id="custom_uri" placeholder="e.g., my-document">
|
||||
<small>Leave blank for an auto-generated URI</small>
|
||||
</div>
|
||||
<form method="post" enctype="multipart/form-data">
|
||||
<div>
|
||||
<label for="file">Select a markdown file:</label>
|
||||
<input type="file" name="file" id="file" accept=".md">
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<input type="submit" value="Upload">
|
||||
</div>
|
||||
</form>
|
||||
<div>
|
||||
<label for="raw_url">Or enter a URL:</label>
|
||||
<input type="url" name="raw_url" id="raw_url" placeholder="https://example.com/markdown-file.md">
|
||||
</div>
|
||||
|
||||
<a href="{{ url_for('main.index') }}">Back to Home</a>
|
||||
</body>
|
||||
</html>
|
||||
<div>
|
||||
<label for="custom_uri">Custom URI (optional):</label>
|
||||
<input type="text" name="custom_uri" id="custom_uri" placeholder="e.g., my-document">
|
||||
<small>Leave blank for an auto-generated URI</small>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<button class="glass" type="submit">Submit</button>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<button class="glass" href="{{ url_for('main.index') }}">Back to Home</button>
|
||||
|
||||
{% endblock %}
|
|
@ -1,69 +1,104 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>{{ filename }} - Markdown Viewer</title>
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/digitallytailored/classless@latest/classless.min.css">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<!--<link rel="stylesheet" href="github-markdown.css">-->
|
||||
<style>
|
||||
pre {
|
||||
background-color: #f5f5f5;
|
||||
padding: 1em;
|
||||
border-radius: 4px;
|
||||
overflow-x: auto;
|
||||
{% extends "base.html" %}
|
||||
{% block head %}
|
||||
{{ super() }}
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<!-- This supports light and dark mode automatically. -->
|
||||
<link rel="stylesheet" href="https://esm.sh/@wooorm/starry-night@3/style/both">
|
||||
<link rel="stylesheet" href="github-markdown.css">
|
||||
<!-- <style>
|
||||
.markdown-body {
|
||||
box-sizing: border-box;
|
||||
min-width: 200px;
|
||||
max-width: 980px;
|
||||
margin: 0 auto;
|
||||
padding: 45px;
|
||||
}
|
||||
|
||||
@media (max-width: 767px) {
|
||||
.markdown-body {
|
||||
padding: 15px;
|
||||
}
|
||||
}
|
||||
|
||||
/* GitHub-style admonitions */
|
||||
.markdown-alert {
|
||||
padding: 0.5rem 1rem;
|
||||
margin-bottom: 16px;
|
||||
border-radius: 6px;
|
||||
}
|
||||
|
||||
.markdown-alert-title {
|
||||
font-weight: 600;
|
||||
margin-bottom: 8px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.markdown-alert-title svg {
|
||||
margin-right: 8px;
|
||||
}
|
||||
|
||||
.markdown-alert-note {
|
||||
border-left: 4px solid #0969da;
|
||||
background-color: #ddf4ff;
|
||||
}
|
||||
|
||||
.markdown-alert-tip {
|
||||
border-left: 4px solid #1a7f37;
|
||||
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);
|
||||
}
|
||||
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
width: 100%;
|
||||
margin: 1em 0;
|
||||
.markdown-alert-tip {
|
||||
background-color: rgba(46, 160, 67, 0.15);
|
||||
}
|
||||
|
||||
table, th, td {
|
||||
border: 1px solid #ddd;
|
||||
.markdown-alert-important,
|
||||
.markdown-alert-warning {
|
||||
background-color: rgba(187, 128, 9, 0.15);
|
||||
}
|
||||
|
||||
th, td {
|
||||
padding: 0.5em;
|
||||
text-align: left;
|
||||
.markdown-alert-caution {
|
||||
background-color: rgba(248, 81, 73, 0.15);
|
||||
}
|
||||
}
|
||||
</style> -->
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
<div class="markdown-body">
|
||||
<h1>{{ filename }}</h1>
|
||||
<p>
|
||||
<strong>Permanent Link:</strong>
|
||||
<code>{{ url_for('main.view_file', uri=uri, _external=True) }}</code>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
.document-info {
|
||||
margin-bottom: 2em;
|
||||
padding: 1em;
|
||||
background-color: #f9f9f9;
|
||||
border-radius: 4px;
|
||||
}
|
||||
.markdown-body {
|
||||
box-sizing: border-box;
|
||||
min-width: 200px;
|
||||
max-width: 980px;
|
||||
margin: 0 auto;
|
||||
padding: 45px;
|
||||
}
|
||||
<div class="markdown-body">
|
||||
{{ content|safe }}
|
||||
</div>
|
||||
|
||||
@media (max-width: 767px) {
|
||||
.markdown-body {
|
||||
padding: 15px;
|
||||
}
|
||||
} </style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="document-info">
|
||||
<h1>{{ filename }}</h1>
|
||||
<p>
|
||||
<strong>Permanent Link:</strong>
|
||||
<code>{{ url_for('main.view_file', uri=uri, _external=True) }}</code>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="content">
|
||||
{{ content|safe }}
|
||||
</div>
|
||||
|
||||
<div class="actions">
|
||||
<a href="{{ url_for('main.upload_file') }}">Upload Another Document</a> |
|
||||
<a href="{{ url_for('main.index') }}">Home</a>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
<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
65
app/utils/utils.py
Normal 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
114
uploads/README.md
Normal 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
760
uploads/docker-list.md
Normal 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> <- 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> <- 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> <- 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> <- Ressourceneffizienteste Option || Basis Funktionen</li>
|
||||
<li><a href="https://onedev.io/" rel="nofollow">OneDev</a> <- Eher für DevOps gedacht, direkte CI/CD integration</li>
|
||||
<li><a href="https://docs.gitlab.com/install/docker/" rel="nofollow">GitLab</a> <- 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> <- 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> <- UpdateCheker with push notifications</li>
|
||||
<li><a href="https://dozzle.dev/" rel="nofollow">doozle</a> <- 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> <- 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> <- 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> <- Alles rund um pdf themen</li>
|
||||
<li><a href="https://github.com/CorentinTh/it-tools" rel="nofollow">IT-Tools</a> <- 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
78
uploads/docker.md
Normal 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
1
uploads/uri_map.json
Normal file
|
@ -0,0 +1 @@
|
|||
{}
|
Loading…
Add table
Add a link
Reference in a new issue