🎉 init
This commit is contained in:
commit
7bf48daab5
10 changed files with 297 additions and 0 deletions
136
.gitignore
vendored
Normal file
136
.gitignore
vendored
Normal file
|
@ -0,0 +1,136 @@
|
||||||
|
# Byte-compiled / optimized / DLL files
|
||||||
|
__pycache__/
|
||||||
|
*.py[cod]
|
||||||
|
*$py.class
|
||||||
|
|
||||||
|
# C extensions
|
||||||
|
*.so
|
||||||
|
|
||||||
|
# Distribution / packaging
|
||||||
|
.Python
|
||||||
|
build/
|
||||||
|
develop-eggs/
|
||||||
|
dist/
|
||||||
|
downloads/
|
||||||
|
eggs/
|
||||||
|
.eggs/
|
||||||
|
lib/
|
||||||
|
lib64/
|
||||||
|
parts/
|
||||||
|
sdist/
|
||||||
|
var/
|
||||||
|
wheels/
|
||||||
|
share/python-wheels/
|
||||||
|
*.egg-info/
|
||||||
|
.installed.cfg
|
||||||
|
*.egg
|
||||||
|
MANIFEST
|
||||||
|
|
||||||
|
# PyInstaller
|
||||||
|
*.manifest
|
||||||
|
*.spec
|
||||||
|
|
||||||
|
# Installer logs
|
||||||
|
pip-log.txt
|
||||||
|
pip-delete-this-directory.txt
|
||||||
|
|
||||||
|
# Unit test / coverage reports
|
||||||
|
htmlcov/
|
||||||
|
.tox/
|
||||||
|
.nox/
|
||||||
|
.coverage
|
||||||
|
.coverage.*
|
||||||
|
.cache
|
||||||
|
nosetests.xml
|
||||||
|
coverage.xml
|
||||||
|
*.cover
|
||||||
|
*.py,cover
|
||||||
|
.hypothesis/
|
||||||
|
.pytest_cache/
|
||||||
|
cover/
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
*.mo
|
||||||
|
*.pot
|
||||||
|
|
||||||
|
# Django stuff:
|
||||||
|
*.log
|
||||||
|
local_settings.py
|
||||||
|
db.sqlite3
|
||||||
|
db.sqlite3-journal
|
||||||
|
|
||||||
|
# Flask stuff:
|
||||||
|
instance/
|
||||||
|
.webassets-cache
|
||||||
|
|
||||||
|
# Scrapy stuff:
|
||||||
|
.scrapy
|
||||||
|
|
||||||
|
# Sphinx documentation
|
||||||
|
docs/_build/
|
||||||
|
|
||||||
|
# PyBuilder
|
||||||
|
.pybuilder/
|
||||||
|
target/
|
||||||
|
|
||||||
|
# Jupyter Notebook
|
||||||
|
.ipynb_checkpoints
|
||||||
|
|
||||||
|
# IPython
|
||||||
|
profile_default/
|
||||||
|
ipython_config.py
|
||||||
|
|
||||||
|
# pdm
|
||||||
|
.pdm.toml
|
||||||
|
|
||||||
|
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
|
||||||
|
__pypackages__/
|
||||||
|
|
||||||
|
# Celery stuff
|
||||||
|
celerybeat-schedule
|
||||||
|
celerybeat.pid
|
||||||
|
|
||||||
|
# SageMath parsed files
|
||||||
|
*.sage.py
|
||||||
|
|
||||||
|
# Environments
|
||||||
|
.env
|
||||||
|
.venv
|
||||||
|
env/
|
||||||
|
venv/
|
||||||
|
ENV/
|
||||||
|
env.bak/
|
||||||
|
venv.bak/
|
||||||
|
|
||||||
|
# Spyder project settings
|
||||||
|
.spyderproject
|
||||||
|
.spyproject
|
||||||
|
|
||||||
|
# Rope project settings
|
||||||
|
.ropeproject
|
||||||
|
|
||||||
|
# mkdocs documentation
|
||||||
|
/site
|
||||||
|
|
||||||
|
# mypy
|
||||||
|
.mypy_cache/
|
||||||
|
.dmypy.json
|
||||||
|
dmypy.json
|
||||||
|
|
||||||
|
# Pyre type checker
|
||||||
|
.pyre/
|
||||||
|
|
||||||
|
# pytype static type analyzerw
|
||||||
|
.pytype/
|
||||||
|
|
||||||
|
# Cython debug symbols
|
||||||
|
cython_debug/
|
||||||
|
|
||||||
|
# PyCharm
|
||||||
|
.idea/
|
||||||
|
|
||||||
|
# Specific
|
||||||
|
.DS_Store
|
||||||
|
/config/
|
||||||
|
/db/
|
||||||
|
.vscode
|
11
Dockerfile
Normal file
11
Dockerfile
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
FROM python:3
|
||||||
|
|
||||||
|
COPY requirements.txt /
|
||||||
|
|
||||||
|
RUN pip3 install -r /requirements.txt
|
||||||
|
|
||||||
|
VOLUME /config
|
||||||
|
|
||||||
|
COPY src /app
|
||||||
|
|
||||||
|
CMD [ "python3", "/app/main.py" ]
|
11
Makefile
Normal file
11
Makefile
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
|
||||||
|
fmt:
|
||||||
|
black .
|
||||||
|
|
||||||
|
clean:
|
||||||
|
fd pycache -I -x rm -rv {}
|
||||||
|
|
||||||
|
restart:
|
||||||
|
docker-compose down
|
||||||
|
docker-compose build
|
||||||
|
docker-compose up -d
|
3
README.md
Normal file
3
README.md
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# Me Site
|
||||||
|
|
||||||
|
Simple website for personal information
|
11
docker-compose.yml
Normal file
11
docker-compose.yml
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
version: '3'
|
||||||
|
|
||||||
|
services:
|
||||||
|
app:
|
||||||
|
build: "."
|
||||||
|
environment:
|
||||||
|
TZ: Europe/Berlin
|
||||||
|
ports:
|
||||||
|
- 1030:1030
|
||||||
|
volumes:
|
||||||
|
- ./config:/config
|
2
requirements.txt
Normal file
2
requirements.txt
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
Flask
|
||||||
|
git+https://github.com/jmarya/htmlpy#egg=htmlpy
|
17
src/assets.py
Normal file
17
src/assets.py
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
from flask import request, session, Blueprint, Response, send_from_directory
|
||||||
|
from htmlpy import *
|
||||||
|
from config import CONFIG
|
||||||
|
import os
|
||||||
|
|
||||||
|
asset_pages = Blueprint("assets", __name__)
|
||||||
|
|
||||||
|
|
||||||
|
def filesend(path):
|
||||||
|
filename = os.path.basename(path)
|
||||||
|
dirpath = os.path.dirname(path)
|
||||||
|
return send_from_directory(dirpath, filename)
|
||||||
|
|
||||||
|
|
||||||
|
@asset_pages.route("/me", methods=["GET"])
|
||||||
|
def me_picture():
|
||||||
|
return filesend("/config/me.avif")
|
3
src/config.py
Normal file
3
src/config.py
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
import json
|
||||||
|
|
||||||
|
CONFIG = json.loads(open("/config/config.json").read())
|
88
src/index.py
Normal file
88
src/index.py
Normal file
|
@ -0,0 +1,88 @@
|
||||||
|
from flask import request, session, Blueprint, Response
|
||||||
|
from htmlpy import *
|
||||||
|
from config import CONFIG
|
||||||
|
from os.path import exists
|
||||||
|
|
||||||
|
main_pages = Blueprint("main", __name__)
|
||||||
|
|
||||||
|
BOOTSTRAP = [
|
||||||
|
Reference(
|
||||||
|
"https://cdn.jsdelivr.net/npm/bootstrap@5.2.0-beta1/dist/css/bootstrap.min.css",
|
||||||
|
"stylesheet",
|
||||||
|
),
|
||||||
|
Reference(
|
||||||
|
"https://cdn.jsdelivr.net/npm/bootstrap-icons@1.9.1/font/bootstrap-icons.css",
|
||||||
|
"stylesheet",
|
||||||
|
),
|
||||||
|
Script(
|
||||||
|
src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0-beta1/dist/js/bootstrap.bundle.min.js"
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def buildSite(content):
|
||||||
|
return Document(
|
||||||
|
head=Head(
|
||||||
|
[Meta(name="viewport", content="width=350, user-scalable=0;"), BOOTSTRAP]
|
||||||
|
),
|
||||||
|
body=Body(
|
||||||
|
content,
|
||||||
|
global_attr=GlobalAttributes(
|
||||||
|
css_class="bg-dark text-white justify-content-center text-center"
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@main_pages.route("/public_key", methods=["GET"])
|
||||||
|
def public_key():
|
||||||
|
try:
|
||||||
|
ret = open("/config/pub.key").read()
|
||||||
|
|
||||||
|
ua = request.user_agent.string.lower()
|
||||||
|
if "chrome" in ua or "safari" in ua or "firefox" in ua:
|
||||||
|
return buildSite(Paragraph(ret.replace("\n", "<br>"))).to_code()
|
||||||
|
|
||||||
|
resp = Response(response=ret, status=200, mimetype="application/pgp-keys")
|
||||||
|
return resp
|
||||||
|
except:
|
||||||
|
return Response(response="", status=502)
|
||||||
|
|
||||||
|
|
||||||
|
# Main
|
||||||
|
@main_pages.route("/", methods=["GET"])
|
||||||
|
def index():
|
||||||
|
return buildSite(
|
||||||
|
[
|
||||||
|
Div(
|
||||||
|
[
|
||||||
|
Image(
|
||||||
|
"/assets/me",
|
||||||
|
200,
|
||||||
|
200,
|
||||||
|
"Me",
|
||||||
|
global_attr=GlobalAttributes(css_class="rounded"),
|
||||||
|
),
|
||||||
|
LineBreak(),
|
||||||
|
LineBreak(),
|
||||||
|
Heading(1, CONFIG["name"]),
|
||||||
|
ThematicBreak(),
|
||||||
|
],
|
||||||
|
global_attr=GlobalAttributes(
|
||||||
|
css_class="container border-dark", style="margin-top: 20px"
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Div(
|
||||||
|
[
|
||||||
|
Heading(1, "Contact"),
|
||||||
|
ThematicBreak(),
|
||||||
|
[Link("/public_key", "My PGP Key"), LineBreak()]
|
||||||
|
if exists("/config/pub.key")
|
||||||
|
else None,
|
||||||
|
Link(f"mailto:{CONFIG['email']}", CONFIG["email"]),
|
||||||
|
LineBreak(),
|
||||||
|
],
|
||||||
|
global_attr=GlobalAttributes(css_class="container border-dark"),
|
||||||
|
),
|
||||||
|
]
|
||||||
|
).to_code()
|
15
src/main.py
Normal file
15
src/main.py
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
from flask import Flask, session, request
|
||||||
|
from config import CONFIG
|
||||||
|
|
||||||
|
app = Flask(__name__)
|
||||||
|
app.secret_key = CONFIG["secret_key"]
|
||||||
|
|
||||||
|
from index import main_pages
|
||||||
|
from assets import asset_pages
|
||||||
|
|
||||||
|
app.register_blueprint(main_pages)
|
||||||
|
app.register_blueprint(asset_pages, url_prefix="/assets")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
app.run(host="0.0.0.0", port=1030, debug=True, threaded=True)
|
Loading…
Add table
Reference in a new issue