diff --git a/.dockerignore b/.dockerignore index c2658d7..6b325ce 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1 +1,3 @@ node_modules/ +.env +.env.example diff --git a/.env.example b/.env.example index a479ace..131ab2d 100644 --- a/.env.example +++ b/.env.example @@ -1,6 +1,7 @@ PACKET_IP=0.0.0.0 -PACKET_SERVER_NAME=localhost.localdomain:8000 +PACKET_SERVER_NAME=localhost:8000 PACKET_DATABASE_URI=postgresql://postgres:mysecretpassword@postgres:5432/postgres +PACKET_OIDC_CLIENT_ID=develop PACKET_OIDC_CLIENT_SECRET= PACKET_LDAP_BIND_PASS= PACKET_LDAP_BIND_DN= diff --git a/.github/workflows/python-app.yml b/.github/workflows/python-app.yml index 29dc65f..4e94a81 100644 --- a/.github/workflows/python-app.yml +++ b/.github/workflows/python-app.yml @@ -15,7 +15,7 @@ jobs: strategy: matrix: - python-version: [3.9] + python-version: [3.14] steps: - name: Install ldap dependencies @@ -38,7 +38,7 @@ jobs: strategy: matrix: - python-version: [3.9] + python-version: [3.14] steps: - name: Install ldap dependencies diff --git a/Dockerfile b/Dockerfile index 78d9e79..7994cd6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/python:3.9-slim-trixie +FROM docker.io/python:3.14-slim-trixie RUN ln -sf /usr/share/zoneinfo/America/New_York /etc/localtime RUN apt-get -yq update && \ @@ -32,4 +32,4 @@ RUN gulp production && \ # Set version for apm RUN echo "export DD_VERSION=\"$(python3 packet/git.py)\"" >> /tmp/version -CMD ["/bin/bash", "-c", "source /tmp/version && ddtrace-run gunicorn packet:app --bind=0.0.0.0:8080 --access-logfile=- --timeout=600"] +CMD ["/bin/bash", "-c", "source /tmp/version && gunicorn packet:app --bind=0.0.0.0:8080 --access-logfile=- --timeout=600"] diff --git a/Dockerfile.dev b/Dockerfile.dev deleted file mode 100644 index 473c469..0000000 --- a/Dockerfile.dev +++ /dev/null @@ -1,34 +0,0 @@ -FROM docker.io/python:3.9-slim-trixie - -RUN ln -sf /usr/share/zoneinfo/America/New_York /etc/localtime -RUN apt-get -yq update && \ - apt-get -yq --no-install-recommends install gcc curl libsasl2-dev libldap2-dev libssl-dev gnupg2 git && \ - apt-get -yq clean all \ - curl -sL https://deb.nodesource.com/setup_20.x | bash - && \ - curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmor -o /usr/share/keyrings/yarn-archive-keyring.gpg && \ - echo "deb [signed-by=/usr/share/keyrings/yarn-archive-keyring.gpg] https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \ - apt-get -yq update && \ - apt-get -yq --no-install-recommends install nodejs yarn - -RUN mkdir /opt/packet -WORKDIR /opt/packet - -COPY requirements.txt /opt/packet/ -RUN pip install -r requirements.txt - -COPY package.json /opt/packet/ -COPY yarn.lock /opt/packet/ - -RUN yarn install && \ - yarn global add gulp - -COPY . /opt/packet -RUN gulp production && \ - rm -rf node_modules && \ - apt-get -yq remove nodejs npm yarn && \ - apt-get -yq autoremove && \ - apt-get -yq clean all - -EXPOSE 8000 - -CMD ["/bin/bash", "-c", "python3 wsgi.py"] diff --git a/README.md b/README.md index 197f50c..04cc310 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ the second major iteration of packet on the web. The first version was 2. Build the dev environment with `docker compose build` 3. Start the dev environment with `docker compose up` 4. Run the database migrations with `docker exec -it packet-packet-1 flask db upgrade` -5. Go check out the app at http://localhost.localdomain:8000 +5. Go check out the app at http://localhost:8080 > Useful Tip: use `docker compose up --watch` so that you don't need to rebuild the container every time you want to test a change diff --git a/config.env.py b/config.env.py index 7e7b883..a36b06b 100644 --- a/config.env.py +++ b/config.env.py @@ -24,7 +24,7 @@ OIDC_CLIENT_SECRET = environ.get("PACKET_OIDC_CLIENT_SECRET", "PLEASE_REPLACE_ME") # SQLAlchemy config -SQLALCHEMY_DATABASE_URI = environ.get("PACKET_DATABASE_URI", "postgresql://postgres:mysecretpassword@localhost:5432/postgres") +SQLALCHEMY_DATABASE_URI = environ.get("PACKET_DATABASE_URI", "postgresql://postgres:mysecretpassword@postgres:5432/postgres") SQLALCHEMY_TRACK_MODIFICATIONS = False # LDAP config diff --git a/docker-compose.yml b/docker-compose.yml index dc452c4..4448bd0 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,12 +2,11 @@ services: packet: build: context: . - dockerfile: ./Dockerfile.dev env_file: - path: ".env" required: true ports: - - "8000:8000" + - "8080:8080" develop: watch: - action: sync+restart @@ -23,14 +22,15 @@ services: postgres: condition: service_healthy restart: true + postgres: - image: "docker.io/postgres:17" + image: docker.io/postgres networks: - packet-network-dev environment: - POSTGRES_USER: "postgres" - POSTGRES_DB: "postgres" - POSTGRES_PASSWORD: "mysecretpassword" + POSTGRES_USER: postgres + POSTGRES_DATABASE: postgres + POSTGRES_PASSWORD: mysecretpassword ports: - "5432:5432" healthcheck: diff --git a/packet/__init__.py b/packet/__init__.py index 85102f5..8870ae1 100644 --- a/packet/__init__.py +++ b/packet/__init__.py @@ -44,7 +44,8 @@ # Initialize the extensions db = SQLAlchemy(app) migrate = Migrate(app, db) -app.logger.info('SQLAlchemy pointed at ' + repr(db.engine.url)) +with app.app_context(): + app.logger.info('SQLAlchemy pointed at ' + repr(db.engine.url)) APP_CONFIG = ProviderConfiguration(issuer=app.config['OIDC_ISSUER'], client_metadata=ClientMetadata(app.config['OIDC_CLIENT_ID'], diff --git a/requirements.in b/requirements.in index 910537c..715d606 100644 --- a/requirements.in +++ b/requirements.in @@ -1,21 +1,20 @@ -Flask-Gzip==0.2 -Flask-Mail==0.10.0 -Flask-Migrate~=2.7.0 -Flask-pyoidc~=3.7.0 -Flask~=1.1.4 -csh-ldap @ git+https://github.com/costowell/csh_ldap@67dd183744746c758d6c13878f539437d2628b63 -ddtrace==3.12.2 -flask_sqlalchemy~=2.5.1 -gunicorn~=20.0.4 -mypy==1.17.1 +Flask-Gzip +Flask-Mail +Flask-Migrate +Flask-pyoidc +Flask +csh-ldap +flask_sqlalchemy +gunicorn +mypy onesignal-sdk~=1.0.0 -psycopg2-binary~=2.9.3 -pylint-quotes==0.2.3 -pylint~=2.8.0 -sentry-sdk~=1.5.12 -sqlalchemy[mypy]~=1.4.31 - +psycopg2-binary +pylint-quotes +pylint +sentry-sdk +sqlalchemy[mypy] +setuptools # Broken transitive dependency we should version -MarkupSafe~=2.0.1 +MarkupSafe # Tool to generate requirements.txt -pip-tools~=6.6.2 +pip-tools diff --git a/requirements.txt b/requirements.txt index 986ffab..bcab3da 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,44 +1,42 @@ -# -# This file is autogenerated by pip-compile with Python 3.13 -# by the following command: -# -# pip-compile requirements.in -# -alembic==1.16.4 +# This file was autogenerated by uv via the following command: +# uv pip compile requirements.in +alembic==1.19.1 # via flask-migrate -annotated-types==0.7.0 +annotated-types==0.8.0 # via pydantic -astroid==2.5.6 +ast-serialize==0.8.0 + # via mypy +astroid==4.0.4 # via pylint blinker==1.9.0 - # via flask-mail -bytecode==0.16.2 - # via ddtrace -certifi==2025.8.3 + # via + # flask + # flask-mail +build==1.5.0 + # via pip-tools +certifi==2026.7.22 # via # requests # sentry-sdk -cffi==1.17.1 +cffi==2.1.1 # via cryptography -charset-normalizer==3.4.3 +charset-normalizer==3.5.1 # via requests -click==7.1.2 +click==8.4.2 # via # flask # pip-tools -cryptography==45.0.6 +cryptography==50.0.0 # via oic -csh-ldap @ git+https://github.com/costowell/csh_ldap@67dd183744746c758d6c13878f539437d2628b63 - # via -r requirements.in -ddtrace==3.12.2 +csh-ldap==2.5.8 # via -r requirements.in defusedxml==0.7.1 # via oic -dnspython==2.7.0 +dill==0.4.1 + # via pylint +dnspython==2.8.0 # via srvlookup -envier==0.6.1 - # via ddtrace -flask==1.1.4 +flask==3.1.3 # via # -r requirements.in # flask-gzip @@ -50,149 +48,143 @@ flask-gzip==0.2 # via -r requirements.in flask-mail==0.10.0 # via -r requirements.in -flask-migrate==2.7.0 +flask-migrate==4.1.0 # via -r requirements.in -flask-pyoidc==3.7.0 +flask-pyoidc==3.14.3 # via -r requirements.in -flask-sqlalchemy==2.5.1 +flask-sqlalchemy==3.1.1 # via # -r requirements.in # flask-migrate future==1.0.0 # via pyjwkest -greenlet==3.2.4 +greenlet==3.5.5 # via sqlalchemy -gunicorn==20.0.4 +gunicorn==26.2.0 # via -r requirements.in -idna==3.10 +idna==3.19 # via requests -importlib-metadata==8.7.0 - # via opentelemetry-api -importlib-resources==6.5.2 +importlib-resources==7.1.0 # via flask-pyoidc -isort==5.13.2 +isort==8.0.1 # via pylint -itsdangerous==1.1.0 +itsdangerous==2.2.0 # via flask -jinja2==2.11.3 +jinja2==3.1.6 # via flask -lazy-object-proxy==1.12.0 - # via astroid -legacy-cgi==2.6.3 - # via ddtrace -mako==1.3.10 +librt==0.15.0 + # via mypy +mako==1.4.1 # via # alembic # oic -markupsafe==2.0.1 +markupsafe==3.0.3 # via # -r requirements.in + # flask # jinja2 # mako -mccabe==0.6.1 + # werkzeug +mccabe==0.7.0 # via pylint -mypy==1.17.1 +mypy==2.3.1 # via # -r requirements.in # sqlalchemy mypy-extensions==1.1.0 # via mypy -oic==1.7.0 +oic==1.6.1 # via flask-pyoidc onesignal-sdk==1.0.0 # via -r requirements.in -opentelemetry-api==1.36.0 - # via ddtrace -pathspec==0.12.1 +packaging==26.3 + # via + # build + # wheel +pathspec==1.1.1 # via mypy -pep517==0.13.1 +pip==26.2.1 # via pip-tools -pip-tools==6.6.2 +pip-tools==7.6.1 # via -r requirements.in -protobuf==6.32.0 - # via ddtrace -psycopg2-binary==2.9.10 +platformdirs==4.11.4 + # via pylint +psycopg2-binary==2.9.12 # via -r requirements.in -pyasn1==0.6.1 +pyasn1==0.6.4 # via # pyasn1-modules # python-ldap pyasn1-modules==0.4.2 # via python-ldap -pycparser==2.22 +pycparser==3.0 # via cffi pycryptodomex==3.23.0 # via # oic # pyjwkest -pydantic==2.11.7 +pydantic==2.13.4 # via pydantic-settings -pydantic-core==2.33.2 +pydantic-core==2.46.4 # via pydantic -pydantic-settings==2.10.1 +pydantic-settings==2.15.0 # via oic -pyjwkest==1.4.2 +pyjwkest==1.4.4 # via oic -pylint==2.8.3 +pylint==4.0.7 # via # -r requirements.in # pylint-quotes pylint-quotes==0.2.3 # via -r requirements.in -python-dotenv==1.1.1 +pyproject-hooks==1.2.0 + # via + # build + # pip-tools +python-dotenv==1.2.3 # via pydantic-settings -python-ldap==3.4.4 +python-ldap==3.4.5 # via csh-ldap -requests==2.32.5 +requests==2.34.2 # via # flask-pyoidc # oic # onesignal-sdk # pyjwkest -sentry-sdk==1.5.12 +sentry-sdk==2.68.1 # via -r requirements.in +setuptools==84.0.0 + # via + # -r requirements.in + # pip-tools six==1.17.0 # via pyjwkest -sqlalchemy[mypy]==1.4.54 +sqlalchemy==2.0.52 # via # -r requirements.in # alembic # flask-sqlalchemy -sqlalchemy2-stubs==0.0.2a38 - # via sqlalchemy -srvlookup==2.0.0 +srvlookup==3.0.0 # via csh-ldap -toml==0.10.2 +tomlkit==0.15.1 # via pylint -typing-extensions==4.14.1 +typing-extensions==4.16.0 # via # alembic - # ddtrace # mypy - # opentelemetry-api # pydantic # pydantic-core - # sqlalchemy2-stubs + # sqlalchemy # typing-inspection -typing-inspection==0.4.1 +typing-inspection==0.4.4 # via # pydantic # pydantic-settings -urllib3==2.5.0 +urllib3==2.7.0 # via # requests # sentry-sdk -werkzeug==1.0.1 +werkzeug==3.1.8 # via flask -wheel==0.45.1 +wheel==0.48.0 # via pip-tools -wrapt==1.12.1 - # via - # astroid - # ddtrace -zipp==3.23.0 - # via importlib-metadata - -# The following packages are considered to be unsafe in a requirements file: -# pip -# setuptools