diff --git a/Dockerfile b/Dockerfile index cc82e71..6eba631 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,12 +1,7 @@ -FROM python:3.8.12-slim-buster +FROM python:3.15-slim-trixie -RUN apt-get -y update && apt-get -y upgrade && \ - apt-get install --no-install-recommends -y wait-for-it lsb-release wget gnupg2 gcc libpq-dev libc-dev - -# install psql 13 (11 is the default with debian) -RUN wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - -RUN echo "deb http://apt.postgresql.org/pub/repos/apt/ `lsb_release -cs`-pgdg main" | tee /etc/apt/sources.list.d/pgdg.list -RUN apt-get update && apt-get --no-install-recommends -y install postgresql-client-13 && apt-get clean all +RUN apt -y update && apt -y upgrade && \ + apt install --no-install-recommends -y wait-for-it lsb-release wget gnupg2 gcc libpq-dev libc-dev vim postgresql-client && apt clean all WORKDIR /app @@ -15,7 +10,7 @@ RUN pip install -U -r requirements.txt RUN mkdir log -ENV PYTHONPATH /app/ +ENV PYTHONPATH=/app/ ENV FLASK_APP=max.app ENV FLASK_ENV=production diff --git a/Dockerfile.dev b/Dockerfile.dev index 36b3738..e0e1e63 100644 --- a/Dockerfile.dev +++ b/Dockerfile.dev @@ -1,12 +1,7 @@ -FROM python:3.8.12-slim-buster +FROM python:3.15-slim-trixie -RUN apt-get -y update && apt-get -y upgrade && \ - apt-get install --no-install-recommends -y wait-for-it lsb-release wget gnupg2 gcc libpq-dev libc-dev vim - -# install psql 13 (11 is the default with debian) -RUN wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - -RUN echo "deb http://apt.postgresql.org/pub/repos/apt/ `lsb_release -cs`-pgdg main" | tee /etc/apt/sources.list.d/pgdg.list -RUN apt-get update && apt-get --no-install-recommends -y install postgresql-client-13 && apt-get clean all +RUN apt -y update && apt -y upgrade && \ + apt install --no-install-recommends -y wait-for-it lsb-release wget gnupg2 gcc libpq-dev libc-dev vim postgresql-client && apt clean all WORKDIR /app @@ -16,7 +11,7 @@ RUN pip install -U -r requirements.txt -r requirements-dev.txt RUN mkdir log -ENV PYTHONPATH /app/ +ENV PYTHONPATH=/app/ ENV FLASK_APP=max.app ENV FLASK_ENV=development diff --git a/Makefile b/Makefile index 1306623..1976943 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ # DEVELOPMENT SERVER build-dev: - docker build -t max-dev -f Dockerfile.dev . + docker build -t max:dev -f Dockerfile.dev . run-dev: | build-dev # bash -c "trap 'docker-compose -f dc.dev.yml down' EXIT; MAX_COMMAND=\"flask run --host 0.0.0.0 --port 8000\" docker-compose -f dc.dev.yml up --build" @@ -29,7 +29,7 @@ run-cleanup: | build-dev # PROD build-prod: - docker build -t max . + docker build -t max:$(shell cat VERSION) . run-prod: docker-compose up -d diff --git a/README.md b/README.md index 87cbd45..9659c68 100644 --- a/README.md +++ b/README.md @@ -3,3 +3,9 @@ A small little program to manage emails. The proxy should add X-Real-IP to get a better logging. + +## Setup + +Requirements: Docker, Make + +Start with `make run-dev` diff --git a/VERSION b/VERSION new file mode 100644 index 0000000..1cc5f65 --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +1.1.0 \ No newline at end of file diff --git a/dc.dev.yml b/dc.dev.yml index 43b4649..9b2c54c 100644 --- a/dc.dev.yml +++ b/dc.dev.yml @@ -1,7 +1,6 @@ -version: '3' services: max: - image: max-dev + image: max:dev volumes: - ./max:/app/max depends_on: diff --git a/docker-compose.yml b/docker-compose.yml index 7f08de6..8b91f55 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,6 @@ -version: '3' services: max: - image: max + image: max:1.1.0 depends_on: - postgresql ports: diff --git a/max/app.py b/max/app.py index c9a8d7e..d7069f7 100644 --- a/max/app.py +++ b/max/app.py @@ -74,9 +74,9 @@ def main(): app.jinja_env.lstrip_blocks = True app.url_rule_class = Rule app.config.update( - SECRET_KEY="123456" - if app.debug - else base64.b64encode(os.urandom(64)).decode("utf-8"), + SECRET_KEY=( + "123456" if app.debug else base64.b64encode(os.urandom(64)).decode("utf-8") + ), SESSION_COOKIE_SECURE=not app.debug, SESSION_COOKIE_SAMESITE=False, ) diff --git a/max/routes/alias/create.py b/max/routes/alias/create.py index a395d88..71bb04b 100644 --- a/max/routes/alias/create.py +++ b/max/routes/alias/create.py @@ -85,9 +85,9 @@ class AliasCreate( for key in ("email", "domain", "enabled", "note"): if hasattr(self, key): context[key] = getattr(self, key) - context[ - "can_use_different_alias_domain" - ] = self.user.can_use_different_alias_domain + context["can_use_different_alias_domain"] = ( + self.user.can_use_different_alias_domain + ) if self.user.can_use_different_alias_domain: context["domains"] = get_domains() else: diff --git a/max/routes/favicon.py b/max/routes/favicon.py index 4d888c6..3faa6e5 100644 --- a/max/routes/favicon.py +++ b/max/routes/favicon.py @@ -16,7 +16,7 @@ class Favicon(AllowAnyAccess, BaseView): def get(self): random_favicon = self.get_random_favicon_filename() - return send_from_directory(FAVICON_FOLDER, random_favicon, add_etags=False) + return send_from_directory(FAVICON_FOLDER, random_favicon, etag=False) def ensure_favicons(self): if STATE_FAVICON_ATTR not in self._state: diff --git a/max/sessions.py b/max/sessions.py index af6e2b2..9aee311 100644 --- a/max/sessions.py +++ b/max/sessions.py @@ -81,7 +81,7 @@ class SessionInterface(FlaskSessionInterface): return Signer(app.secret_key, salt="flask-session", key_derivation="hmac") def get_cookie_name(self, app): - return app.session_cookie_name + return app.config["SESSION_COOKIE_NAME"] def make_session_object(self, session_id=None, data=None): return Session(session_id, data=data) @@ -119,7 +119,9 @@ class SessionInterface(FlaskSessionInterface): secure = self.get_cookie_secure(app) expires = self.get_expiration_time(app, session) session_storage[session.id] = dict(session) - session_id = self._get_signer(app).sign(want_bytes(session.id)) + session_id = ( + self._get_signer(app).sign(want_bytes(session.id)).decode("utf-8") + ) response.set_cookie( cookie_name, session_id, diff --git a/requirements.txt b/requirements.txt index 726c3e5..60f0c02 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,3 @@ -flask -psycopg2 -gunicorn +Flask==3.1.3 +psycopg2==2.9.13 +gunicorn==26.2.0