== preflight note: working tree has uncommitted changes == dump production database first == sync code and inputs == build and recreate Image dutyfreeprofessor-app:latest Building Image dutyfreeprofessor-browser:latest Building #1 [internal] load local bake definitions #1 reading from stdin 1.01kB done #1 DONE 0.0s #2 [app internal] load build definition from Dockerfile #2 transferring dockerfile: 1.42kB done #2 DONE 0.0s #3 [browser internal] load build definition from Dockerfile #3 transferring dockerfile: 513B done #3 DONE 0.0s #4 [browser internal] load metadata for mcr.microsoft.com/playwright/python:v1.49.0-noble #4 DONE 0.2s #5 [app internal] load metadata for docker.io/library/node:22-slim #5 ... #6 [browser internal] load .dockerignore #6 transferring context: 2B done #6 DONE 0.0s #7 [browser internal] load build context #7 transferring context: 31B 0.0s done #7 DONE 0.0s #8 [browser 1/4] FROM mcr.microsoft.com/playwright/python:v1.49.0-noble@sha256:35a390e70ab8ba7fbc909dc01af2329e287e89ccc8fb2f04a1a7ae94cacc5c30 #8 resolve mcr.microsoft.com/playwright/python:v1.49.0-noble@sha256:35a390e70ab8ba7fbc909dc01af2329e287e89ccc8fb2f04a1a7ae94cacc5c30 0.1s done #8 DONE 0.1s #9 [browser 2/4] RUN pip install --no-cache-dir --break-system-packages playwright==1.49.0 #9 CACHED #10 [browser 3/4] WORKDIR /srv/browser #10 CACHED #11 [browser 4/4] COPY server.py ./ #11 CACHED #12 [browser] exporting to image #12 exporting layers done #12 exporting manifest sha256:a7e5b35830dd7ef9606b9e035a5df5088b696597b8ea170487a90bb86837a813 done #12 exporting config sha256:ff074d336264b4e2b474cd05d3f2f34252461d7ec2014fc18078986ce5517c4a done #12 exporting attestation manifest sha256:516969364eef4c9aca6972bad66cb7e5f116b5fb3f76c453f7b28e8404966209 0.0s done #12 exporting manifest list sha256:169b49089f2a8b0393d7eb9c0c3e727fd2ecebdbe16a61bbc1cd20e2f58e4d2f 0.0s done #12 naming to docker.io/library/dutyfreeprofessor-browser:latest done #12 unpacking to docker.io/library/dutyfreeprofessor-browser:latest 0.0s done #12 DONE 0.2s #5 [app internal] load metadata for docker.io/library/node:22-slim #5 DONE 0.4s #13 [app internal] load metadata for docker.io/library/python:3.12-slim #13 DONE 0.4s #14 [app internal] load .dockerignore #14 transferring context: 2B done #14 DONE 0.0s #15 [app internal] load build context #15 DONE 0.0s #16 [app pybuild 1/7] FROM docker.io/library/python:3.12-slim@sha256:78387bc3881b8273120a12ebe6c1ab22b018ccc2c9adf565ae1ac9b536e184ea #16 resolve docker.io/library/python:3.12-slim@sha256:78387bc3881b8273120a12ebe6c1ab22b018ccc2c9adf565ae1ac9b536e184ea #16 ... #17 [app webbuild 1/7] FROM docker.io/library/node:22-slim@sha256:83f487e0a63425e5b4d146fb5e5be574bcbe1b7b843d3ebafdd95eaf7767a7e5 #17 resolve docker.io/library/node:22-slim@sha256:83f487e0a63425e5b4d146fb5e5be574bcbe1b7b843d3ebafdd95eaf7767a7e5 0.1s done #17 DONE 0.1s #16 [app pybuild 1/7] FROM docker.io/library/python:3.12-slim@sha256:78387bc3881b8273120a12ebe6c1ab22b018ccc2c9adf565ae1ac9b536e184ea #16 resolve docker.io/library/python:3.12-slim@sha256:78387bc3881b8273120a12ebe6c1ab22b018ccc2c9adf565ae1ac9b536e184ea 0.2s done #16 DONE 0.2s #15 [app internal] load build context #15 transferring context: 724.56kB 0.1s done #15 DONE 0.1s #18 [app runtime 3/9] RUN pip install --no-cache-dir --upgrade pip #18 CACHED #19 [app runtime 2/9] WORKDIR /srv/app #19 CACHED #20 [app runtime 4/9] COPY pyproject.toml ./ #20 CACHED #21 [app runtime 5/9] RUN pip install --no-cache-dir . #21 CACHED #22 [app pybuild 4/7] COPY pyproject.toml ./ #22 CACHED #23 [app pybuild 2/7] WORKDIR /build #23 CACHED #24 [app pybuild 3/7] RUN pip install --no-cache-dir --upgrade pip #24 CACHED #25 [app webbuild 3/7] COPY web/package.json web/package-lock.json* ./ #25 CACHED #26 [app webbuild 2/7] WORKDIR /web #26 CACHED #27 [app pybuild 5/7] RUN pip install --no-cache-dir . #27 CACHED #28 [app webbuild 4/7] RUN npm install --no-audit --no-fund #28 CACHED #29 [browser] resolving provenance for metadata file #29 DONE 0.0s #30 [app webbuild 5/7] COPY web/ ./ #30 ... #31 [app runtime 6/9] COPY app ./app #31 DONE 0.2s #32 [app pybuild 6/7] COPY app ./app #32 DONE 0.2s #30 [app webbuild 5/7] COPY web/ ./ #30 DONE 0.3s #33 [app pybuild 7/7] RUN python -c "import json,pathlib; from app.main import app; pathlib.Path('openapi.json').write_text(json.dumps(app.openapi()))" #33 ... #34 [app runtime 7/9] COPY alembic.ini ./ #34 DONE 0.2s #35 [app runtime 8/9] COPY alembic ./alembic #35 DONE 0.1s #33 [app pybuild 7/7] RUN python -c "import json,pathlib; from app.main import app; pathlib.Path('openapi.json').write_text(json.dumps(app.openapi()))" #33 4.192 2026-09-11 03:53:41,148 CRITICAL app.services.accounts ACCOUNT_OWNER is unset, a placeholder or not a valid username: nobody is the super admin on this host. Set it in .app.env and recreate the container (docs/ACCOUNTS.md); `accounts owner-check` says the same. #33 4.972 /usr/local/lib/python3.12/site-packages/fastapi/openapi/utils.py:303: UserWarning: Duplicate Operation ID me_api_bw_me_get for function me at /build/app/vendor/bw_admin_api.py #33 4.972 warnings.warn(message, stacklevel=1) #33 DONE 5.5s #36 [app webbuild 6/7] COPY --from=pybuild /build/openapi.json ./openapi.json #36 DONE 0.1s #37 [app webbuild 7/7] RUN npx openapi-typescript openapi.json -o src/api/schema.ts && npm run build #37 3.086 ✨ openapi-typescript 7.13.0 #37 3.827 🚀 openapi.json → src/api/schema.ts [746.3ms] #37 4.168 #37 4.168 > dutyfreeprofessor-web@0.11.4 build #37 4.168 > tsc -b && vite build #37 4.168 #37 19.35 vite v6.4.3 building for production... #37 19.61 transforming... #37 24.57 ✓ 215 modules transformed. #37 25.17 rendering chunks... #37 25.62 [plugin vite:reporter] #37 25.62 (!) /web/src/pages/NotFoundPage.tsx is dynamically imported by /web/src/App.tsx but also statically imported by /web/src/pages/ArticlePage.tsx, dynamic import will not move module into another chunk. #37 25.62 #37 25.67 computing gzip size... #37 25.73 dist/index.html 1.12 kB │ gzip: 0.52 kB #37 25.73 dist/assets/AdminPage-BUr5XcNq.css 0.50 kB │ gzip: 0.28 kB #37 25.73 dist/assets/ArticlesPage-H6UFa8OF.css 0.56 kB │ gzip: 0.29 kB #37 25.73 dist/assets/AuthPages-BbM0sKPO.css 1.24 kB │ gzip: 0.43 kB #37 25.73 dist/assets/SettingsPage-C5BYV9c2.css 1.45 kB │ gzip: 0.60 kB #37 25.73 dist/assets/FeaturePage-DaGWySms.css 1.55 kB │ gzip: 0.56 kB #37 25.73 dist/assets/SourcesPage-dh8aKpW6.css 1.83 kB │ gzip: 0.62 kB #37 25.73 dist/assets/SavingsPage-BScH2Jjj.css 3.98 kB │ gzip: 1.00 kB #37 25.73 dist/assets/DiscussionPage-vonGCudz.css 11.24 kB │ gzip: 2.15 kB #37 25.73 dist/assets/PlanPage-DBMTP_ue.css 11.82 kB │ gzip: 2.49 kB #37 25.73 dist/assets/TodoPage-DdkVqv-I.css 13.34 kB │ gzip: 2.53 kB #37 25.73 dist/assets/QuotePage-DPEKD7ub.css 15.70 kB │ gzip: 2.84 kB #37 25.73 dist/assets/StructurePage-LSO0sxlK.css 19.51 kB │ gzip: 3.61 kB #37 25.73 dist/assets/index-C3q6ti0u.css 70.26 kB │ gzip: 12.30 kB #37 25.73 dist/assets/TripRedirect-DC_A88ft.js 0.42 kB │ gzip: 0.33 kB #37 25.73 dist/assets/ExclusivesPage-DEoIL75Z.js 0.86 kB │ gzip: 0.53 kB #37 25.73 dist/assets/AwardsPage-PA8gCKfL.js 0.87 kB │ gzip: 0.53 kB #37 25.73 dist/assets/ForgotPage-Bq98l3eH.js 1.07 kB │ gzip: 0.60 kB #37 25.73 dist/assets/FeaturePage-Dq1OTVBQ.js 1.13 kB │ gzip: 0.48 kB #37 25.73 dist/assets/LoginPage-Mmi4r_y9.js 1.57 kB │ gzip: 0.78 kB #37 25.73 dist/assets/ArticlesPage-DHDQe4gv.js 1.71 kB │ gzip: 0.74 kB #37 25.73 dist/assets/AccountPage-736Ij_d4.js 2.14 kB │ gzip: 0.91 kB #37 25.73 dist/assets/SetPasswordPage-B_2i92MG.js 2.24 kB │ gzip: 1.00 kB #37 25.73 dist/assets/CollectionPage-D-Anc7iK.js 2.42 kB │ gzip: 1.06 kB #37 25.73 dist/assets/FeatureThread-Bz3EPWxD.js 2.70 kB │ gzip: 1.05 kB #37 25.73 dist/assets/AirportsPage-DzBjjUDb.js 3.34 kB │ gzip: 1.30 kB #37 25.73 dist/assets/SourcesPage-CbY6_MqM.js 3.71 kB │ gzip: 1.36 kB #37 25.73 dist/assets/TodoPage-DuAgrATY.js 4.94 kB │ gzip: 2.06 kB #37 25.73 dist/assets/SettingsPage-BaHPuFAj.js 5.50 kB │ gzip: 1.84 kB #37 25.73 dist/assets/SavingsPage-ChEWpFqX.js 6.62 kB │ gzip: 2.33 kB #37 25.73 dist/assets/QuotePage-IkUaJ0tG.js 17.89 kB │ gzip: 6.38 kB #37 25.73 dist/assets/PlanPage-CLK-zqTS.js 19.93 kB │ gzip: 6.27 kB #37 25.73 dist/assets/DiscussionPage-C7NUwa4p.js 20.85 kB │ gzip: 7.28 kB #37 25.73 dist/assets/AdminPage-vGx6SBjs.js 27.01 kB │ gzip: 8.02 kB #37 25.73 dist/assets/StructurePage-BbwrnMnw.js 48.21 kB │ gzip: 14.42 kB #37 25.73 dist/assets/index-BWrKu3S5.js 318.51 kB │ gzip: 97.48 kB #37 25.73 ✓ built in 6.29s #37 DONE 25.9s #38 [app runtime 9/9] COPY --from=webbuild /web/dist ./static #38 DONE 0.1s #39 [app] exporting to image #39 exporting layers #39 exporting layers 0.5s done #39 exporting manifest sha256:951ead1b68be170542c29770b3b86d97dd2c5304bf4134659b792bcd0dc1256c 0.0s done #39 exporting config sha256:ebf5ec6ef9a6fdbef0999a8f4366347c24d6fb0d0cad04cbd1a35f3b749adee7 0.0s done #39 exporting attestation manifest sha256:1eb0c8a02fe2b24600bd2053389f6c4fa481e52df38457b498b54971c240b07c 0.0s done #39 exporting manifest list sha256:02a358caf07fabd0ecb56ba5c3569958153a5e988c918c32a8d2ba745120530a 0.0s done #39 naming to docker.io/library/dutyfreeprofessor-app:latest #39 naming to docker.io/library/dutyfreeprofessor-app:latest done #39 unpacking to docker.io/library/dutyfreeprofessor-app:latest #39 unpacking to docker.io/library/dutyfreeprofessor-app:latest 0.4s done #39 DONE 1.0s #40 [app] resolving provenance for metadata file #40 DONE 0.0s Image dutyfreeprofessor-app:latest Built Image dutyfreeprofessor-browser:latest Built Container dutyfreeprofessor-browser Running Container dutyfreeprofessor-db Running Container dutyfreeprofessor-app Recreate Container dutyfreeprofessor-app Recreated Container dutyfreeprofessor-db Waiting Container dutyfreeprofessor-db Healthy Container dutyfreeprofessor-app Starting Container dutyfreeprofessor-app Started == health {"status":"ok","version":"0.35.0","database":"ok"} == done exit 0