anvil-works / anvil-runtime

The runtime engine for hosting Anvil web apps
https://anvil.works/open-source
Other
874 stars 116 forks source link

Anvil App Server & anvil-extras #72

Closed vvfrwl closed 11 months ago

vvfrwl commented 11 months ago

Dear Sirs Is it possible to add anvil-extras to App Server as dependencies? Is it bug or App Server limitation or I'm doing wrong? Applications work fine with anvil-extras on anvil.works, but not on local Anvil App Server.

Anvil App Server - 1.8.0 (pip3 installation, not docker) openjdk 17.0.8 2023-07-18 : OpenJDK Runtime Environment (build 17.0.8+7-Debian-1deb12u1)

Empty APP from anvil.works (runtime "python3-full") with third-party dependency C6ZZPAPN4YYF5NVJ - does not work. Empty APP from anvil.works (runtime "python3-full") + cloned to local anvil-extras as dependency - does not work.

anvil-extras installation

Browser message when trying to server access: JSON object keys must be strings

Server output:

(anvil_env) osadmin@AnvilSRV:~/anvil_env$ anvil-app-server --app TEST
Found Anvil App Server JAR in package directory
Found 7 migration(s) for (base runtime) DB.
Executing Anvil migrations...
Database currently at "2023-03-31-inline-media-storage"
Database is already up to date.
[TRACE anvil.app-server.run] Invalidating; new version 1
WARN - Bad pool size config, start 3 > max 2. Using 2 as start.
[WARN  anvil.app-server.tables] This app does not have a 'db_schema' configuration, so we are not setting up the database.
[INFO  anvil.core.server] HTTP Server running on port 3030
[INFO  anvil.app-server.run] App URL:  http://localhost:3030
[INFO  anvil.app-server.dispatch] Launching built-in downlink...
[ERROR anvil.app-server.run] Failed to start mail server on port 25 - this application will not be able to receive email:  java.net.BindException: Permission denied
Connecting to ws://localhost:3030/_/downlink
Anvil websocket open
[INFO  anvil.executors.downlink] Downlink client connected with spec {:runtime "python3-full", :session_id "NX5sveOAIQLzlxYXlTyX"}
Downlink authenticated OK

[INFO  anvil.app-server.run] [SESSION] browser 3P2GUWNCTRG27ABNYDDX5FHTR6P7VZ5A {:addr 192.168.111.50, :location nil}
[ERROR anvil.util] Reporting uncaught exception in GET /
java.lang.Exception: JSON object keys must be strings
        at clojure.data.json$write_object.invokeStatic(json.clj:327)
        at clojure.data.json$write_object.invoke(json.clj:319)
        at clojure.data.json$fn__606$G__601__613.invoke(json.clj:286)
        at clojure.data.json$write_object.invokeStatic(json.clj:335)
        at clojure.data.json$write_object.invoke(json.clj:319)
        at clojure.data.json$fn__606$G__601__613.invoke(json.clj:286)
        at clojure.data.json$write_object.invokeStatic(json.clj:335)
        at clojure.data.json$write_object.invoke(json.clj:319)
        at clojure.data.json$fn__606$G__601__613.invoke(json.clj:286)
        at clojure.data.json$write.invokeStatic(json.clj:475)
        at clojure.data.json$write.doInvoke(json.clj:424)
        at clojure.lang.RestFn.applyTo(RestFn.java:142)
        at clojure.core$apply.invokeStatic(core.clj:661)
        at clojure.core$apply.invoke(core.clj:652)
        at clojure.data.json$write_str.invokeStatic(json.clj:482)
        at clojure.data.json$write_str.doInvoke(json.clj:477)
        at clojure.lang.RestFn.applyTo(RestFn.java:139)
        at clojure.core$apply.invokeStatic(core.clj:663)
        at clojure.core$apply.invoke(core.clj:652)
        at anvil.util$write_json_str.invokeStatic(util.clj:126)
        at anvil.util$write_json_str.doInvoke(util.clj:125)
        at clojure.lang.RestFn.invoke(RestFn.java:410)
        at anvil.runtime.server$serve_app$fn__25087.invoke(server.clj:228)
        at anvil.runtime.server$serve_app.invokeStatic(server.clj:158)
        at anvil.runtime.server$serve_app.invoke(server.clj:156)
        at anvil.app_server.run$fn__1672.invokeStatic(run.clj:230)
        at anvil.app_server.run$fn__1672.invoke(run.clj:229)
        at compojure.core$wrap_response$fn__4892.invoke(core.clj:158)
        at compojure.core$wrap_route_middleware$fn__4876.invoke(core.clj:128)
        at compojure.core$wrap_route_info$fn__4881.invoke(core.clj:137)
        at compojure.core$wrap_route_matches$fn__4885.invoke(core.clj:146)
        at compojure.core$routing$fn__4900.invoke(core.clj:185)
        at clojure.core$some.invokeStatic(core.clj:2693)
        at clojure.core$some.invoke(core.clj:2684)
        at compojure.core$routing.invokeStatic(core.clj:185)
        at compojure.core$routing.doInvoke(core.clj:182)
        at clojure.lang.RestFn.applyTo(RestFn.java:139)
        at clojure.core$apply.invokeStatic(core.clj:659)
        at clojure.core$apply.invoke(core.clj:652)
        at compojure.core$routes$fn__4904.invoke(core.clj:192)
        at anvil.runtime.sessions$with_app_session$fn__7018.invoke(sessions.clj:468)
        at anvil.app_server.run$wrap_constant_app$fn__1605.invoke(run.clj:156)
        at compojure.core$routing$fn__4900.invoke(core.clj:185)
        at clojure.core$some.invokeStatic(core.clj:2693)
        at clojure.core$some.invoke(core.clj:2684)
        at compojure.core$routing.invokeStatic(core.clj:185)
        at compojure.core$routing.doInvoke(core.clj:182)
        at clojure.lang.RestFn.applyTo(RestFn.java:139)
        at clojure.core$apply.invokeStatic(core.clj:659)
        at clojure.core$apply.invoke(core.clj:652)
        at compojure.core$routes$fn__4904.invoke(core.clj:192)
        at clojure.lang.Var.invoke(Var.java:381)
        at anvil.app_server.run$wrap_with_origin_scheme_and_port$fn__1684.invoke(run.clj:271)
        at anvil.app_server.run$wrap_provide_source$fn__1661.invoke(run.clj:210)
        at ring.middleware.json$wrap_json_response$fn__1531.invoke(json.clj:139)
        at ring.middleware.flash$wrap_flash$fn__376.invoke(flash.clj:39)
        at ring.middleware.session$wrap_session$fn__477.invoke(session.clj:108)
        at ring.middleware.keyword_params$wrap_keyword_params$fn__515.invoke(keyword_params.clj:53)
        at ring.middleware.nested_params$wrap_nested_params$fn__565.invoke(nested_params.clj:89)
        at ring.middleware.multipart_params$wrap_multipart_params$fn__778.invoke(multipart_params.clj:173)
        at ring.middleware.params$wrap_params$fn__794.invoke(params.clj:67)
        at ring.middleware.cookies$wrap_cookies$fn__22762.invoke(cookies.clj:214)
        at ring.middleware.absolute_redirects$wrap_absolute_redirects$fn__897.invoke(absolute_redirects.clj:47)
        at ring.middleware.resource$wrap_resource_prefer_resources$fn__802.invoke(resource.clj:25)
        at ring.middleware.content_type$wrap_content_type$fn__861.invoke(content_type.clj:34)
        at ring.middleware.default_charset$wrap_default_charset$fn__877.invoke(default_charset.clj:31)
        at ring.middleware.not_modified$wrap_not_modified$fn__850.invoke(not_modified.clj:61)
        at ring.middleware.x_headers$wrap_x_header$fn__347.invoke(x_headers.clj:22)
        at ring.middleware.x_headers$wrap_x_header$fn__347.invoke(x_headers.clj:22)
        at ring.middleware.x_headers$wrap_x_header$fn__347.invoke(x_headers.clj:22)
        at anvil.app_server.run$wrap_retrieve_original_remote_address$fn__1678.invoke(run.clj:267)
        at org.httpkit.server.HttpHandler.run(RingHandler.java:117)
        at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
        at anvil.core.worker_pool$run_one_task_BANG_.invokeStatic(worker_pool.clj:55)
        at anvil.core.worker_pool$run_one_task_BANG_.invoke(worker_pool.clj:38)
        at anvil.core.worker_pool$launch_thread_BANG_$fn__5663.invoke(worker_pool.clj:94)
        at clojure.lang.AFn.run(AFn.java:22)
        at java.base/java.lang.Thread.run(Thread.java:833)

Thank you Best regards Vadim

MichalH1521 commented 11 months ago

Hi, I was struggling with the same issue until I ran into this part of the documentation in anvil runtime repository regarding app dependencies. Following the tutorial, I managed to get the anvil extras routing module working in a local app. However, I still can't quite figure out how to use anvil-extras components (such as progress bar or autocomplete textbox) in local apps as they are always shown as "Dependency missing: No such form" objects.

vvfrwl commented 11 months ago

@MichalH1521 Oh. I read that document. I thought the dependency record that came from anwil.work is ok:

anvil.yaml:

dependencies:
- dep_id: dep_l0b2zqe9lz2s8mu
  version: {dev: false}
  resolution_hints: {app_id: <app_id>, name: AnvilExtras, package_name: anvil_extras}

it should be:

dependencies:
- app_id: <app_id>
  version: {dev: false}

In meaning it looks the same (like new syntax), but not.

Thank you. I was going to downgrade Java :)