Skip to content

PyPi - Pakete ein Sicherheitsproblem?

Python3
  • Beim Lesen diesen Beitrages bekomme ich ein ungutes Gefühl. Da man ja bei Python ständig externe Pakete importiert hier ein Beispiel

    ###############################################
    # Imports
    ###############################################
    
    import json
    import locale
    from pathlib import Path
    from functools import partial
    from dataclasses import dataclass
    
    from pywebio import start_server, config
    from pywebio.pin import put_input
    from pywebio.session import info as session_info
    from pywebio.output import put_text, \
        put_table, \
        use_scope, \
        scroll_to, \
        put_markdown, \
        put_buttons, \
        put_button, \
        clear, \
        put_info, \
        put_error, \
        put_html, \
        put_tabs, \
        toast, \
        put_image, \
        put_row, \
        put_grid, \
        put_loading
    from pywebio.input import input, \
        input_group, \
        NUMBER, \
        PASSWORD, \
        TEXT, \
        URL, \
        radio
    from pywebio_battery import popup_input
    import requests as requests  # Requests for making network connections.
    
    from bs4 import BeautifulSoup  # For extracting data from HTML and XML docs.
    

    Das ist mein Import für ein kleines neues Tool, wo ich mein Portfolio mit anzeigen möchte. Ein wenig Spielerei, aber spannend und ich lerne wieder was dabei.

    In diesem Artikel, stehen auch ein paar Pakete, die ich nutze 😟
    https://blog.phylum.io/phylum-discovers-revived-crypto-wallet-address-replacement-attack

    Ich habe dann mal in der Gruppe PyDDF "Python Meeting Düsseldorf" nachgefragt, wie die Lage ist. Einer der Tipps war dann, VMs bzw. Docker zu benutzen, das ermöglicht ja eine gewisse Trennung vom Haupt-System.

    Docker läuft sowieso, dann kann ich das ja mal ausprobieren. Nach vielem Rumprobieren habe ich jetzt aktuelle eine funktionierende Lösung.

    Im Projekt gibt es ein dockerfile

    FROM python:3.10
    # Or any preferred Python version.
    ADD main.py .
    RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y locales
    RUN sed -i -e 's/# de_DE.UTF-8 UTF-8/de_DE.UTF-8 UTF-8/' /etc/locale.gen && \
        dpkg-reconfigure --frontend=noninteractive locales && \
        update-locale LANG=de_DE.UTF-8
    ENV LANG de_DE.UTF-8
    RUN pip install requests beautifulsoup4 pywebio pywebio_battery matplotlib
    CMD python ./main.py
    # Or enter the name of your unique directory and parameter set.
    

    Als nächstes brauchen wir mal folgendes

    docker build -t python-imagename .
    

    Danach dann starten mit

    docker run -d --rm --publish 7070:7070 --name portfolio python-imagename:latest
    

    Jetzt findet man die Anwendung wie gewohnt unter

    http://192.168.3.xxx:7070
    

    Die locales waren eine kleine Herausforderung, ich hoffe das passt jetzt so. Werde ich die Tage noch intensiver beobachten.

    Damit das Ganze halbwegs praktikabel ist, habe ich mir ein kleines Script geschrieben.

    scraping.sh

    #!/bin/bash
    ### BEGIN INIT INFO
    # Provides:          scraping
    # Required-Start:
    # Required-Stop:
    # Should-Start:
    # Default-Start:
    # Default-Stop:
    # Short-Description: scraping
    # Description:       scraping
    ### END INIT INFO
    
    case "$1" in
    stop)
        docker kill portfolio
        exit 0
            ;;
    
    start)
        #!/bin/bash
        cd /home/frankm/PycharmProjects/scraping/
        docker kill portfolio
        docker build -t python-portfolio .
        docker run -d --rm --publish 7070:7070 --name portfolio python-portfolio:latest
    
        exit 0
            ;;
    *)
            echo "Usage: basename $0 {start | stop}" >&2
            exit 64
            ;;
    esac
    exit 0
    

    Jetzt kann man nach einer Änderung am Code das Script schreiben. Der Docker Container wird gestoppt, falls er läuft. Danach wird das Image neu gebaut und dann gestartet.

    Zum Stoppen

    ./scraping.sh stop
    

    Zum Starten

    ./scraping.sh start
    

    Das kann man aber, in meinen Augen, nur mit fertigen Anwendungen machen. Wenn man entwickelt, braucht man ständig die Ausgaben auf der Konsole. Das fehlt einem ja dann im Container. Bin gespannt wie sich das weiter entwickelt.

    An die Docker Spezialisten draußen im Netz, wenn man das anders bzw. besser macht, bitte ich um einen Kommentar. Danke 😉

  • Portfolio - mein kleines Flask Projekt

    Python3
    5
    0 Stimmen
    5 Beiträge
    177 Aufrufe
    FrankMF

    Hab ChatGPT nochmal nach der Installation auf einem Production Server befragt.

    ChatGPT

    Certainly! Here's a short example of the steps you can follow to deploy a Flask application on a production server using Nginx and Gunicorn:

    Prepare your server:

    Set up a server (e.g., using a cloud provider like AWS, DigitalOcean, or a dedicated server) and ensure it has a clean, up-to-date installation of a Linux distribution (e.g., Ubuntu or CentOS).

    Install required software:

    Install necessary software packages on your server. You'll need Python, pip (Python package manager), Nginx, and Gunicorn. You can use your distribution's package manager (e.g., apt for Ubuntu or yum for CentOS) to install these dependencies.

    Deploy your Flask application:

    Copy your Flask application code and any required dependencies to your server.

    Set up a virtual environment (optional but recommended):

    Create a virtual environment for your Flask application to isolate its dependencies. You can use venv or virtualenv for this purpose.

    Install Flask and any required Python packages within your virtual environment:

    pip install flask

    Test your Flask application:

    Ensure your Flask application runs correctly within your server's virtual environment.

    Configure Gunicorn:

    Create a Gunicorn configuration file (e.g., gunicorn_config.py) to specify the settings for running your Flask application. Here's a simple example: workers = 4 # Number of Gunicorn worker processes bind = '0.0.0.0:8000' # The address and port Gunicorn should listen on

    Start Gunicorn:

    Start Gunicorn with your Flask application: gunicorn -c gunicorn_config.py your_app:app

    Configure Nginx:

    Create an Nginx server block (often located in /etc/nginx/sites-available) to define how Nginx should handle incoming requests. Here's a simplified example: server { listen 80; server_name your_domain.com www.your_domain.com; location / { proxy_pass http://127.0.0.1:8000; # Pass requests to Gunicorn proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }

    Enable the Nginx server block and restart Nginx:

    sudo ln -s /etc/nginx/sites-available/your_config /etc/nginx/sites-enabled/ sudo nginx -t # Test Nginx configuration sudo systemctl restart nginx

    Configure your DNS:

    Point your domain name to your server's IP address.

    Secure your server (optional but recommended):

    Set up SSL/TLS certificates for your domain to enable HTTPS. You can use Let's Encrypt for free SSL certificates.

    Monitor your application:

    Set up monitoring tools and logs to keep track of your application's performance and troubleshoot any issues.

    These are the basic steps to deploy a Flask application on a production server with Nginx and Gunicorn. Please note that this is a simplified example, and there are many additional considerations, such as database configuration, security, and optimization, depending on your specific application and requirements. It's also important to keep your server and software up to date and follow security best practices to ensure the stability and security of your production environment.

    Das werde ich doch mal ausprobieren 😎

  • Pycharm - Umzug auf neuen Rechner

    Linux
    1
    0 Stimmen
    1 Beiträge
    78 Aufrufe
    Niemand hat geantwortet
  • Docker & Redis Datenbank

    Verschoben Linux
    2
    0 Stimmen
    2 Beiträge
    184 Aufrufe
    FrankMF

    @FrankM sagte in Docker & Redis Datenbank:

    save 60 1
    #save 900 1
    save 300 10
    save 60 10000

    Hier kann man auch noch schön sehen, wie ich gekämpft habe, bis ich mal eine dump.rdb gesehen habe. Auch irgendwie logisch, das ich nie eine gesehen hatte, wenn man weiß das

    save 900 1

    bedeutet, das er alle 900 Sekunden speichert, wenn mindestens eine Änderung vorhanden ist. Das kann dann schon was dauern. Ich habe das dann mal verkürzt, damit ich schneller ein Ergebnis habe.

    save 60 1

    Das brachte mich dann dem Ziel näher. Danach konnte ich die dump.rdb auch finden.

    Bitte keine Redis DB ohne Passwort laufen lassen!
  • Manjaro Stable-Update vom 20.02.23

    Linux
    2
    0 Stimmen
    2 Beiträge
    109 Aufrufe
    FrankMF

    Ich konnte es nicht lassen, ich habe es mal getestet.

       ~  docker version  ✔  1m 37s  Client: Version: 23.0.1 API version: 1.42 Go version: go1.20 Git commit: a5ee5b1dfc Built: Sat Feb 11 13:58:04 2023 OS/Arch: linux/amd64 Context: default

    In der aktuellen systemd Datei steht folgendes drin. Bei mir zu finden unter /usr/lib/systemd/system/docker.service

    LimitNOFILE=infinity LimitNPROC=infinity LimitCORE=infinity

    Die override Dateien angelegt und durchgestartet. Läuft alles einwandfrei. Aber bitte fragt mich nicht, was dieser Wert da oben macht. Ich habe keine Ahnung.

    Update: Erklärung zu ulimits https://stackoverflow.com/questions/62127643/need-understand-ulimits-nofile-setting-in-host-and-container

  • Vorstellung Restic UI als PyWebIO Version

    PyWebIO
    7
    0 Stimmen
    7 Beiträge
    175 Aufrufe
    FrankMF

    Link Preview Image Merge branch 'master' into 'main' (45c83cd8) · Commits · Frank / restic_ui_pywebio · GitLab

    Fix some bugs See merge request Bullet64/restic_ui_pywebio!71

    favicon

    GitLab (gitlab.com)

  • Python - Dict -> JSON und umgekehrt

    Python3
    1
    0 Stimmen
    1 Beiträge
    287 Aufrufe
    Niemand hat geantwortet
  • PyQt6 - QSettings

    Python3
    3
    0 Stimmen
    3 Beiträge
    325 Aufrufe
    FrankMF
    Möglichkeit 1

    Das hier

    settings = QSettings("Frank_Mankel", "Restic_UI")

    erzeugt unter

    /home/frank/.config/Frank_Mankel/Restic_UI.conf

    die Konfigurationsdatei.

    Möglichkeit 2

    Das hier

    settings = QSettings("Restic_UI")

    erzeugt unter

    /home/frank/.config/Restic_UI.conf

    die Konfigurationsdatei.

    Damit habe ich die grundlegenden Dinge, hoffentlich 😉 , verstanden.

    Für den Rest mal in die Dokumentation schauen.

    Sehr hilfreich war auch mal ein Blick auf die Definition der Klasse. Rechtsklick auf QSettings und dann Go to Definition

    class QSettings(QObject): class Scope(enum.Enum): UserScope = ... # type: QSettings.Scope SystemScope = ... # type: QSettings.Scope class Format(enum.Enum): NativeFormat = ... # type: QSettings.Format IniFormat = ... # type: QSettings.Format InvalidFormat = ... # type: QSettings.Format class Status(enum.Enum): NoError = ... # type: QSettings.Status AccessError = ... # type: QSettings.Status FormatError = ... # type: QSettings.Status [..gekürzt..]
  • Docker - Portainer

    Linux
    3
    0 Stimmen
    3 Beiträge
    696 Aufrufe
    FrankMF

    Dann grabe ich das mal wieder aus 😉

    Bedingt durch den Wegfall meines Proxmox, musste ich mir Gedanken darüber machen, wie ein paar Dienste auch weiterhin laufen sollen. Um mal die zwei wichtigsten zu nennen.

    checkmk DokuWiki

    Diese sollen später, wenn der zweite NanoPi R5S aus China da ist, dort laufen. Da der aber mit der Schneckenpost kommt, kann man ja in der Zwischenzeit mal wieder mit Docker spielen.

    Ich erinnerte mich daran, das checkmk eine sehr gute Anleitung hat, so das ich das mal wieder ausprobierte. Klappte einwandfrei. Dann erinnerte mich an Portainer und dachte mir, das probiere ich mal wieder aus 🙂

    1d2dc9b3-ad71-45c5-b552-72c88a1bf773-grafik.png

    Ich hatte übrigens die Endpoints gesucht und nicht gefunden, die heißen jetzt Environments. Auf dem Bild ist noch keiner eingerichtet.

    4bdbf196-1b36-4e65-94d0-0e56daa473bf-grafik.png

    Irgendwie ist das wirklich richtig gute Software. Ich mag den Portainer und auch als selbst ausgebildeter ITler 😉 kommt man damit sehr schnell ganz gut zurecht.

    Ja, man kann die ganzen Docker Befehle auch über die Konsole eingeben, was ich normalerweise auch mit ganz vielen Dingen mache, aber das macht hier einfach Spaß. Man hat auch schnell einen guten Überblick was wo läuft usw.

    Wer so was sucht, einfach mal ausprobieren. Klare Empfehlung von mir.