diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..e69de29 diff --git a/manyfold/README.md b/manyfold/README.md index 5bc85b9..eaa453c 100644 --- a/manyfold/README.md +++ b/manyfold/README.md @@ -1,16 +1,29 @@ # Manyfold container The XRForge-serverimage is a pre-configured [Manyfold](https://manyfold.app) container (reproducably via [nix](https://nixos.org) dockertools). -It also contains some extra's, to better fit an XR audience. +It also contains some extra's, to better fit an XR audience & enable community libraries. > To run the container, see the [sysadmin](https://manyfold.app/sysadmin/) documentation of the [manyfold](https://github.com/manyfold3d/manyfold) project. -# Build the container-image +# Build/Run the container-image ```bash +$ git clone --recursive --depth 1 https://codeberg.org/coderofsalvation/xrforge.git +$ cd xrforge $ docker load < $(nix-build nix/docker.nix) +$ manyfold/cli/manyfold run + +[xrforge] podman detected..starting OCI container ++ /run/current-system/sw/bin/podman run -p 8790:3214 -p 8791:3215 --name xrforge -e SECRET_KEY_BASE=lkjwljlkwejrlkjek34k234l -e DATABASE_ADAPTER=sqlite3 -e SUDO_RUN_UNSAFELY=enabled -e MULTIUSER=enabled -e FEDER +ATION=enabled -e THEME=vapor -e HOMEPAGE=/models -e FEDERATE_DRIVE_CACHE=5s -v ./xrfragment/assets:/mnt/assets/xrfragment/#1 --cap-add SYS_ADMIN --security-opt apparmor:unconfined --device /dev/fuse xrforge +[xrforge] booting... +[xrforge] applying filesystem overlay +sending incremental file list +... ``` +> NOTE: if you don't want the default XR Fragments asset-library, omit `--recursive` in the git cmd. + # Extra environment-variables | environment variable | default | info | @@ -48,7 +61,7 @@ $ docker load < $(nix-build nix/docker.nix) The server-image will boot `manyfold/cli/manyfold.sh boot` and check for directory `/manyfold` (in the container). When found, it uses the files in there instead (`/manyfold/usr/src/app/public/404.html` instead of `/usr/src/app/public/404.html` e.g.). -# Federated drives +# Federated libraries Besides ActivitPub, XRForge allows federating manyfold libraries too, which allows manyfold libraries to: @@ -94,6 +107,26 @@ The quickest way is: By default environment-flag `FEDERATE_DRIVE_PATH` will share path `/mnt/experiences` as an open web directory. Make sure that the URL (and credentials if configure) of step 3 are setup properly, so it matches your reverse proxy/ or SSL configuration (via `FEDERATE_DRIVE_CERT` and `FEDERATE_DRIVE_KEY` flags) +# Git libraries + +XRForge also automatically maps git-repositories as libraries. +Repositories are detected via the `/mnt` directory, which can be fed as a **volume** via the docker cmd: + +``` +$ cd xrforge +xrforge $ mkdir mnt && cd mnt +xrforge/mnt $ git clone https://codeberg.org/my/repo +xrforge/mnt $ ls repo + +john/#1023/foo.glb +john/#1023/bar.glb +mary/#103/flop.glb + +xrforge $ docker run xrforge ... -v ./mnt/repo:/mnt/repo ... +``` + +> **NOTE**: repositories need to respect XRForge's `{creator}/{modelId}` modelpath. This automatically creates creators/models in the database. This does not mean creators can automatically log in (no passwords are set), which should be fine for most archive-like purposes. + # Unixy event hooks Until WebEvents/WebSub [gets supported on a REST-level in manyfold](https://github.com/orgs/manyfold3d/projects/4/views/1?filterQuery=Pub&pane=issue&itemId=108834509&issue=manyfold3d%7Cmanyfold%7C4097), things like boot-phase, scheduler and file-changes can be reacted up via the `/root/hook.d` directory: diff --git a/manyfold/cli/manyfold.sh b/manyfold/cli/manyfold.sh index 6689159..4d61d34 100755 --- a/manyfold/cli/manyfold.sh +++ b/manyfold/cli/manyfold.sh @@ -104,7 +104,7 @@ db(){ add_lib_to_db(){ name=$(basename $1) - debug sqlite3 $db "INSERT INTO libraries SELECT NULL, '$1', DATE('NOW'), DATE('NOW'), '', '', '$name', NULL, '', 'filesystem', '', '', '', '', '', '$name', 1 WHERE NOT EXISTS (SELECT 1 FROM libraries WHERE path = '$1');" + sqlite3 $db "INSERT INTO libraries SELECT NULL, '$1', DATE('NOW'), DATE('NOW'), '', '', '$name', NULL, '', 'filesystem', '', '', '', '', '', '$name', 1 WHERE NOT EXISTS (SELECT 1 FROM libraries WHERE path = '$1');" } set_upload_path(){ @@ -112,10 +112,17 @@ set_upload_path(){ test -d $UPLOAD_PATH || mkdir $UPLOAD_PATH add_lib_to_db $UPLOAD_PATH id=$(sqlite3 $db "select id from libraries where path = '$UPLOAD_PATH';") - debug sqlite3 $db "UPDATE settings set value = $id where var = 'default_library';" + sqlite3 $db "UPDATE settings set value = $id where var = 'default_library';" } -rclone_mount(){ +mount_dir(){ + find /mnt -type d -mindepth 1 -maxdepth 1 | while read dir; do + echocolor "[$APPNAME]" "mounting $dir as library" + add_lib_to_db "$dir" + done +} + +mount_rclone(){ libraries(){ rclone listremotes | while read remote; do @@ -171,6 +178,12 @@ start_syslog(){ tail -f /var/log/messages & } +scan_libraries(){ + sleep 10 # wait for manyfold/redis to boot first + cd /usr/src/app + bin/manyfold libraries scan +} + # The new entrypoint of the docker boot(){ echocolor "[$APPNAME]" "booting..." @@ -181,9 +194,11 @@ boot(){ set_homepage set_theme set_modelpath - rclone_mount + mount_dir + mount_rclone set_upload_path start_hook_daemon + scan_libraries & hook boot # emit unixy hook-event (/root/hook.d/boot/* scripts) exec "$@" # exec prevents error 's6-overlay-suexec: fatal: can only run as pid 1' diff --git a/manyfold/manyfold.sql b/manyfold/manyfold.sql index e7f14fb..ef017df 100644 --- a/manyfold/manyfold.sql +++ b/manyfold/manyfold.sql @@ -136,31 +136,25 @@ INSERT INTO schema_migrations VALUES('20250609210440'); INSERT INTO schema_migrations VALUES('20250620141805'); INSERT INTO schema_migrations VALUES('20250621223410'); INSERT INTO schema_migrations VALUES('20250629212656'); -INSERT INTO schema_migrations VALUES('20250716093106'); -INSERT INTO schema_migrations VALUES('20250724094951'); CREATE TABLE IF NOT EXISTS "ar_internal_metadata" ("key" varchar NOT NULL PRIMARY KEY, "value" varchar, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL); INSERT INTO ar_internal_metadata VALUES('environment','production','2025-07-25 10:52:31.380052','2025-07-25 10:52:31.380054'); CREATE TABLE IF NOT EXISTS "libraries" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "path" varchar NOT NULL, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL, "notes" varchar, "caption" varchar, "name" varchar, "tag_regex" text, "icon" text, "storage_service" varchar DEFAULT 'filesystem' NOT NULL, "s3_endpoint" varchar DEFAULT NULL, "s3_region" varchar DEFAULT NULL, "s3_bucket" varchar DEFAULT NULL, "s3_access_key_id" varchar DEFAULT NULL, "s3_secret_access_key" varchar DEFAULT NULL, "public_id" varchar, "s3_path_style" boolean DEFAULT 1 NOT NULL); -INSERT INTO libraries VALUES(6,'/mnt/experiences','2025-08-07','2025-08-07','','','experiences',NULL,'','filesystem','','','','','','experiences',1); CREATE TABLE IF NOT EXISTS "tags" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar, "created_at" datetime, "updated_at" datetime, "taggings_count" integer DEFAULT 0); -INSERT INTO tags VALUES(1,'fontmap','2025-08-11 07:14:34.877804','2025-08-11 07:14:34.877804',1); CREATE TABLE IF NOT EXISTS "taggings" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "tag_id" integer, "taggable_type" varchar, "taggable_id" integer, "tagger_type" varchar, "tagger_id" integer, "context" varchar(128), "created_at" datetime, CONSTRAINT "fk_rails_9fcd2e236b" FOREIGN KEY ("tag_id") REFERENCES "tags" ("id") ); -INSERT INTO taggings VALUES(1,1,'Model',1,NULL,NULL,'tags','2025-08-11 07:14:34.907021'); -CREATE TABLE IF NOT EXISTS "links" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "url" varchar, "linkable_type" varchar, "linkable_id" integer, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL, "synced_at" datetime(6)); -INSERT INTO links VALUES(1,'https://xrfragment.org','Creator',1,'2025-08-11 07:07:58.791010','2025-08-11 07:07:58.791010',NULL); +CREATE TABLE IF NOT EXISTS "links" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "url" varchar, "linkable_type" varchar, "linkable_id" integer, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL); CREATE TABLE IF NOT EXISTS "settings" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "var" varchar NOT NULL, "value" text, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL); -INSERT INTO settings VALUES(1,'default_library','6','2025-07-25 10:58:00.004576','2025-07-28 13:30:03.381376'); +INSERT INTO settings VALUES(1,'default_library',replace('--- 2\n','\n',char(10)),'2025-07-25 10:58:00.004576','2025-07-28 13:30:03.381376'); INSERT INTO settings VALUES(2,'site_name',replace('--- XRForge\n','\n',char(10)),'2025-07-25 10:59:04.496016','2025-07-25 10:59:04.496016'); -INSERT INTO settings VALUES(3,'site_tagline',replace('--- Self-sovereign XR Experiences. Connect 3D files via URLs\n','\n',char(10)),'2025-07-25 10:59:04.519264','2025-08-07 10:49:23.348065'); -INSERT INTO settings VALUES(4,'theme','vapor','2025-07-25 10:59:04.522670','2025-08-07 10:47:16.469331'); -INSERT INTO settings VALUES(5,'about',replace('--- |-\n XRForge is a preconfigured Manyfold, tailored to an XR Audience.\n\n # Features\n\n * linked VR-experiences (via XR Fragments spec)\n * federated libraries / network drives\n * automatic packaging for game-engines\n','\n',char(10)),'2025-07-25 10:59:04.527612','2025-08-07 10:51:18.592181'); +INSERT INTO settings VALUES(3,'site_tagline',replace('--- Self-sovereign XR Experiences based on 3D files & URLs\n','\n',char(10)),'2025-07-25 10:59:04.519264','2025-07-25 10:59:04.519264'); +INSERT INTO settings VALUES(4,'theme','vapor','2025-07-25 10:59:04.522670','2025-07-28 13:47:54.690364'); +INSERT INTO settings VALUES(5,'about',replace('--- ''''\n','\n',char(10)),'2025-07-25 10:59:04.527612','2025-07-25 10:59:04.527612'); INSERT INTO settings VALUES(6,'rules',replace('--- ''''\n','\n',char(10)),'2025-07-25 10:59:04.531378','2025-07-25 10:59:04.531378'); INSERT INTO settings VALUES(7,'support_link',replace('--- https://forgejo.isvery.ninja/coderofsalvation/xrforge\n','\n',char(10)),'2025-07-25 10:59:04.533678','2025-07-25 10:59:04.533678'); INSERT INTO settings VALUES(8,'site_icon',replace('--- ''''\n','\n',char(10)),'2025-07-25 10:59:04.536228','2025-07-25 14:19:06.192651'); -INSERT INTO settings VALUES(9,'model_path_template',replace('--- "{creator}/{modelId}"\n','\n',char(10)),'2025-07-28 15:57:18.598798','2025-07-28 15:57:18.598798'); +INSERT INTO settings VALUES(9,'model_path_template',replace('--- "{tags}/{tags}/{modelName}{modelId}"\n','\n',char(10)),'2025-07-28 15:57:18.598798','2025-07-28 15:57:18.598798'); INSERT INTO settings VALUES(10,'parse_metadata_from_path',replace('--- true\n','\n',char(10)),'2025-07-28 15:57:18.624917','2025-07-28 15:57:18.624917'); INSERT INTO settings VALUES(11,'safe_folder_names',replace('--- true\n','\n',char(10)),'2025-07-28 15:57:18.627224','2025-07-28 15:57:18.627224'); INSERT INTO settings VALUES(12,'model_ignored_files',replace('---\n- !ruby/regexp /^\.[^\.]+/\n- !ruby/regexp /.*\/@eaDir\/.*/\n- !ruby/regexp /__MACOSX/\n','\n',char(10)),'2025-07-28 15:57:18.633182','2025-07-28 15:57:18.633182'); @@ -169,15 +163,7 @@ INSERT INTO settings VALUES(14,'model_tags_tag_model_directory_name',replace('-- INSERT INTO settings VALUES(15,'model_tags_stop_words_locale',replace('--- en\n','\n',char(10)),'2025-07-28 15:57:18.643185','2025-07-28 15:57:18.643185'); INSERT INTO settings VALUES(16,'model_tags_custom_stop_words',replace('---\n- png\n- jpeg\n- jpg\n- jpe\n- pjpeg\n- gif\n- bmp\n- tiff\n- tif\n- svg\n- webp\n- threeds\n- 3ds\n- amf\n- ldr\n- mpd\n- scad\n- dwg\n- dxf\n- threemf\n- 3mf\n- gltf\n- glb\n- iges\n- igs\n- mtl\n- obj\n- step\n- stp\n- stl\n- collada\n- dae\n- draco\n- drc\n- vrml\n- wrl\n- abc\n- blend\n- brep\n- cheetah3d\n- jas\n- fbx\n- fcstd\n- f3d\n- f3z\n- ipt\n- iam\n- maya\n- ma\n- mb\n- mix\n- modo\n- lxo\n- ply\n- sketchup\n- skp\n- sldprt\n- hfp\n- speedtree\n- spm\n- x3d\n- gcode\n- bgcode\n- lychee\n- lys\n- lyt\n- chitubox\n- ctb\n- mpeg\n- mpg\n- mpe\n- webm\n- mp4\n- m4v\n- html\n- xhtml\n- text\n- txt\n- pdf\n- md\n- doc\n- docx\n- bin\n- gbr\n- gerber\n- geb\n- gb\n- gbrjob\n- drl\n- kicad_pro\n- pro\n- kicad_mod\n- kicad_pcb\n- kicad_sym\n- kicad_sch\n- sch\n- kicad_wks\n- zip\n- gzip\n- gz\n- rar\n- sevenz\n- 7z\n- bz2\n','\n',char(10)),'2025-07-28 15:57:18.645648','2025-07-28 15:57:18.645648'); INSERT INTO settings VALUES(17,'model_tags_auto_tag_new',replace('--- "!new"\n','\n',char(10)),'2025-07-28 15:57:18.648518','2025-07-28 15:57:18.648518'); -INSERT INTO settings VALUES(18,'registration_enabled',replace('--- true\n','\n',char(10)),'2025-08-07 10:46:21.848049','2025-08-07 10:46:21.848049'); -INSERT INTO settings VALUES(19,'approve_signups',replace('--- false\n','\n',char(10)),'2025-08-07 10:46:21.907863','2025-08-07 10:46:21.907863'); -INSERT INTO settings VALUES(20,'default_signup_role',replace('--- contributor\n','\n',char(10)),'2025-08-07 10:46:21.916715','2025-08-07 10:46:21.916715'); -INSERT INTO settings VALUES(21,'autocreate_creator_for_new_users',replace('--- true\n','\n',char(10)),'2025-08-07 10:46:21.926311','2025-08-07 10:46:21.926311'); -INSERT INTO settings VALUES(22,'default_viewer_role',replace('--- member\n','\n',char(10)),'2025-08-07 10:46:21.935093','2025-08-07 10:46:21.935093'); -INSERT INTO settings VALUES(23,'enable_user_quota',replace('--- false\n','\n',char(10)),'2025-08-07 10:46:21.944399','2025-08-07 10:46:21.944399'); -INSERT INTO settings VALUES(24,'default_user_quota',replace('--- 0\n','\n',char(10)),'2025-08-07 10:46:21.950723','2025-08-07 10:46:21.950723'); CREATE TABLE IF NOT EXISTS "problems" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "problematic_type" varchar, "problematic_id" integer, "category" integer, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL, "note" varchar DEFAULT NULL, "ignored" boolean DEFAULT 0 NOT NULL, "public_id" varchar, "in_progress" boolean DEFAULT 0 NOT NULL); -INSERT INTO problems VALUES(2,'Model',1,11,'2025-08-11 07:14:44.067192','2025-08-11 07:14:44.067192',NULL,0,'hwlxhqvk7w7r',0); CREATE TABLE IF NOT EXISTS "favorites" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "favoritable_type" varchar NOT NULL, "favoritable_id" integer NOT NULL, "favoritor_type" varchar NOT NULL, "favoritor_id" integer NOT NULL, "scope" varchar DEFAULT 'printed' NOT NULL, "blocked" boolean DEFAULT 0 NOT NULL, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL); CREATE TABLE IF NOT EXISTS "flipper_features" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "key" varchar NOT NULL, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL); CREATE TABLE IF NOT EXISTS "flipper_gates" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "feature_key" varchar NOT NULL, "key" varchar NOT NULL, "value" text, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL); @@ -190,7 +176,7 @@ CREATE TABLE IF NOT EXISTS "users_roles" ("user_id" integer, "role_id" integer); INSERT INTO users_roles VALUES(1,4); INSERT INTO users_roles VALUES(1,1); CREATE TABLE IF NOT EXISTS "users" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "email" varchar DEFAULT '' NOT NULL, "encrypted_password" varchar DEFAULT '' NOT NULL, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL, "username" varchar NOT NULL, "pagination_settings" json DEFAULT '{"models":true,"creators":true,"collections":true,"per_page":12}', "renderer_settings" json DEFAULT '{"grid_width":200,"grid_depth":200,"show_grid":true,"enable_pan_zoom":false,"background_colour":"#000000","object_colour":"#ffffff","render_style":"original"}', "tag_cloud_settings" json DEFAULT '{"threshold":2,"heatmap":true,"keypair":true,"sorting":"frequency"}', "problem_settings" json DEFAULT '{"missing":"danger","empty":"info","nesting":"warning","inefficient":"info","duplicate":"warning","no_image":"silent","no_3d_model":"silent","non_manifold":"warning","inside_out":"warning","no_license":"silent","no_links":"silent","no_creator":"silent","no_tags":"silent"}', "file_list_settings" json DEFAULT '{"hide_presupported_versions":true}', "reset_password_token" varchar, "remember_created_at" datetime(6), "reset_password_sent_at" datetime(6), "interface_language" varchar, "failed_attempts" integer DEFAULT 0 NOT NULL, "locked_at" datetime(6), "auth_provider" varchar, "auth_uid" varchar, "sensitive_content_handling" varchar DEFAULT NULL, "public_id" varchar, "approved" boolean DEFAULT 1 NOT NULL, "quota" integer DEFAULT 1 NOT NULL, "quota_use_site_default" boolean DEFAULT 1 NOT NULL); -INSERT INTO users VALUES(1,'xrforge@localhost','$2a$12$u/j8LRzbPiJRHmi1eV/fvOXXiKxN2vBGtNd.Pt28w.wOnq3rnfpzO','2025-07-25 10:52:56.989975','2025-08-11 07:05:45.209885','xrforge','{"models":true,"creators":true,"collections":true,"per_page":12}','{"grid_width":200,"grid_depth":200,"show_grid":true,"enable_pan_zoom":false,"background_colour":"#000000","object_colour":"#ffffff","render_style":"original"}','{"threshold":2,"heatmap":true,"keypair":true,"sorting":"frequency"}','{"missing":"danger","empty":"info","nesting":"warning","inefficient":"info","duplicate":"warning","no_image":"silent","no_3d_model":"silent","non_manifold":"warning","inside_out":"warning","no_license":"silent","no_links":"silent","no_creator":"silent","no_tags":"silent"}','{"hide_presupported_versions":true}',NULL,'2025-08-11 07:05:45.208500',NULL,NULL,0,NULL,NULL,NULL,NULL,'71863vkppj6k',1,1,1); +INSERT INTO users VALUES(1,'xrforge@localhost','$2a$12$u/j8LRzbPiJRHmi1eV/fvOXXiKxN2vBGtNd.Pt28w.wOnq3rnfpzO','2025-07-25 10:52:56.989975','2025-07-25 12:46:27.338917','xrforge','{"models":true,"creators":true,"collections":true,"per_page":12}','{"grid_width":200,"grid_depth":200,"show_grid":true,"enable_pan_zoom":false,"background_colour":"#000000","object_colour":"#ffffff","render_style":"original"}','{"threshold":2,"heatmap":true,"keypair":true,"sorting":"frequency"}','{"missing":"danger","empty":"info","nesting":"warning","inefficient":"info","duplicate":"warning","no_image":"silent","no_3d_model":"silent","non_manifold":"warning","inside_out":"warning","no_license":"silent","no_links":"silent","no_creator":"silent","no_tags":"silent"}','{"hide_presupported_versions":true}',NULL,'2025-07-25 12:46:27.325287',NULL,NULL,0,NULL,NULL,NULL,NULL,'71863vkppj6k',1,1,1); CREATE TABLE IF NOT EXISTS "federails_followings" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "actor_id" integer NOT NULL, "target_actor_id" integer NOT NULL, "status" integer DEFAULT 0, "federated_url" varchar, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL, "uuid" varchar DEFAULT NULL, CONSTRAINT "fk_rails_2e62338faa" FOREIGN KEY ("actor_id") REFERENCES "federails_actors" ("id") @@ -202,22 +188,7 @@ CREATE TABLE IF NOT EXISTS "federails_activities" ("id" integer PRIMARY KEY AUTO FOREIGN KEY ("actor_id") REFERENCES "federails_actors" ("id") ); -INSERT INTO federails_activities VALUES(1,'Federails::Actor',2,'Create',1,'2025-08-11 07:07:58.701474','2025-08-11 07:07:58.876261','533e3d24-4f3b-41ce-aea4-2b44c51f3d04'); -INSERT INTO federails_activities VALUES(2,'Federails::Actor',3,'Create',1,'2025-08-11 07:08:57.465310','2025-08-11 07:08:57.525980','de39545b-7f21-47f2-b283-3f48150dc1de'); -INSERT INTO federails_activities VALUES(3,'Federails::Actor',4,'Create',1,'2025-08-11 07:14:35.073201','2025-08-11 07:14:35.102927','3c137d07-e8ae-47af-9c47-ba97f25c1746'); -INSERT INTO federails_activities VALUES(4,'Comment',1,'Create',2,'2025-08-11 07:15:26.394452','2025-08-11 07:15:26.394452','91b2b8d4-5d56-4b17-9ba6-7db5ac0fd3a5'); -INSERT INTO federails_activities VALUES(5,'Comment',2,'Create',2,'2025-08-11 07:24:45.549316','2025-08-11 07:24:45.549316','25aee6f6-d57c-4fc7-b9a9-8546ef058749'); -INSERT INTO federails_activities VALUES(6,'Federails::Actor',4,'Update',1,'2025-08-11 07:29:38.394492','2025-08-11 07:29:38.489061','91c075fa-ac0b-467e-b2f6-6f82cbc40f69'); -INSERT INTO federails_activities VALUES(7,'Federails::Actor',4,'Update',1,'2025-08-11 13:42:47.136658','2025-08-11 13:42:47.275209','d587a29e-e2b6-4892-ad24-44bcd748186b'); CREATE TABLE IF NOT EXISTS "caber_relations" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "subject_type" varchar, "subject_id" integer, "permission" varchar, "object_type" varchar NOT NULL, "object_id" integer NOT NULL, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL); -INSERT INTO caber_relations VALUES(1,'User',1,'own','Creator',1,'2025-08-11 07:07:58.784365','2025-08-11 07:07:58.784365'); -INSERT INTO caber_relations VALUES(2,'Role',4,'view','Creator',1,'2025-08-11 07:07:58.903544','2025-08-11 07:07:58.903544'); -INSERT INTO caber_relations VALUES(3,'User',1,'own','Collection',1,'2025-08-11 07:08:57.495084','2025-08-11 07:08:57.495084'); -INSERT INTO caber_relations VALUES(4,'Role',4,'view','Collection',1,'2025-08-11 07:08:57.537413','2025-08-11 07:08:57.537413'); -INSERT INTO caber_relations VALUES(5,'User',1,'own','Model',1,'2025-08-11 07:14:34.852077','2025-08-11 07:14:34.852077'); -INSERT INTO caber_relations VALUES(6,'Role',4,'view','Model',1,'2025-08-11 07:14:35.135758','2025-08-11 07:14:35.135758'); -INSERT INTO caber_relations VALUES(7,NULL,NULL,'view','Creator',1,'2025-08-11 07:15:19.800404','2025-08-11 07:15:19.800404'); -INSERT INTO caber_relations VALUES(8,NULL,NULL,'view','Model',1,'2025-08-11 07:15:19.851560','2025-08-11 07:15:19.851560'); CREATE TABLE IF NOT EXISTS "federails_moderation_reports" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "federated_url" varchar, "federails_actor_id" integer, "content" varchar, "object_type" varchar, "object_id" integer, "resolved_at" datetime(6), "resolution" varchar, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL, CONSTRAINT "fk_rails_a5cda24d4c" FOREIGN KEY ("federails_actor_id") REFERENCES "federails_actors" ("id") @@ -227,8 +198,6 @@ CREATE TABLE IF NOT EXISTS "comments" ("id" integer PRIMARY KEY AUTOINCREMENT NO FOREIGN KEY ("federails_actor_id") REFERENCES "federails_actors" ("id") ); -INSERT INTO comments VALUES(1,'q6hxq3r8jwnv','Creator',1,'Model',1,'A new 3D model, ["Fontmap"](http://localhost:3214/models/vrpw4zlgzzm8), was just published!','2025-08-11 07:15:26.378633','2025-08-11 07:15:26.378633',1,0,NULL,2); -INSERT INTO comments VALUES(2,'s6w0nbxv8wmt','Creator',1,'Model',1,'The 3D model ["XR Fragments assets"](http://localhost:3214/models/vrpw4zlgzzm8), was just updated!','2025-08-11 07:24:45.534105','2025-08-11 07:24:45.534105',1,0,NULL,2); CREATE TABLE IF NOT EXISTS "oauth_applications" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar NOT NULL, "uid" varchar NOT NULL, "secret" varchar NOT NULL, "redirect_uri" text, "scopes" varchar DEFAULT '' NOT NULL, "confidential" boolean DEFAULT 1 NOT NULL, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL, "owner_id" bigint, "owner_type" varchar); CREATE TABLE IF NOT EXISTS "oauth_access_grants" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "resource_owner_id" integer NOT NULL, "application_id" integer NOT NULL, "token" varchar NOT NULL, "expires_in" integer NOT NULL, "redirect_uri" text NOT NULL, "scopes" varchar DEFAULT '' NOT NULL, "created_at" datetime(6) NOT NULL, "revoked_at" datetime(6), CONSTRAINT "fk_rails_b4b53e07b8" FOREIGN KEY ("application_id") @@ -246,9 +215,6 @@ FOREIGN KEY ("resource_owner_id") ); CREATE TABLE IF NOT EXISTS "federails_actors" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar, "federated_url" varchar, "username" varchar, "server" varchar, "inbox_url" varchar, "outbox_url" varchar, "followers_url" varchar, "followings_url" varchar, "profile_url" varchar, "entity_id" integer, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL, "entity_type" varchar DEFAULT NULL, "public_key" text, "private_key" text, "uuid" varchar, "extensions" json, "local" boolean DEFAULT 0 NOT NULL, "actor_type" varchar, "tombstoned_at" datetime(6)); INSERT INTO federails_actors VALUES(1,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,'2025-07-25 10:52:57.029315','2025-07-25 10:52:57.029315','User',NULL,NULL,'eb64d114-1bc7-4cb3-8be6-350d23ccfb3e',NULL,1,NULL,NULL); -INSERT INTO federails_actors VALUES(2,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,'2025-08-11 07:07:58.778020','2025-08-11 07:07:58.778020','Creator',NULL,NULL,'bdff9ca9-88da-4b14-a7cb-01887e5d3c8e',NULL,1,NULL,NULL); -INSERT INTO federails_actors VALUES(3,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,'2025-08-11 07:08:57.485286','2025-08-11 07:08:57.485286','Collection',NULL,NULL,'8478020b-6b34-4e86-8511-4a1bb738a331',NULL,1,NULL,NULL); -INSERT INTO federails_actors VALUES(4,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,'2025-08-11 07:14:34.840250','2025-08-11 07:14:34.840250','Model',NULL,NULL,'18ccb599-8b40-4778-91f7-6b7970f0b256',NULL,1,NULL,NULL); CREATE TABLE IF NOT EXISTS "model_files" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "filename" varchar, "model_id" integer NOT NULL, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL, "presupported" boolean DEFAULT 0 NOT NULL, "y_up" boolean DEFAULT 0 NOT NULL, "digest" varchar, "notes" text, "caption" text, "size" bigint, "presupported_version_id" integer, "attachment_data" json, "public_id" varchar, "filename_lower" varchar GENERATED ALWAYS AS (LOWER(filename)) STORED, "previewable" boolean DEFAULT 0 NOT NULL, CONSTRAINT "fk_rails_b5ac05b6e3" FOREIGN KEY ("presupported_version_id") REFERENCES "model_files" ("id") @@ -256,10 +222,6 @@ FOREIGN KEY ("presupported_version_id") FOREIGN KEY ("model_id") REFERENCES "models" ("id") ); -INSERT INTO model_files VALUES(1,'fontmap.glb',1,'2025-08-11 07:14:35.064935','2025-08-11 07:14:44.111333',0,0,'35e8f851a1e012681f160d62c5acdb7f670b0f9a0060debe43858d70d804660485280a5ba110ff7a778aab603caeea786bb479d595a82d7ec0acff36a7e35eca',NULL,NULL,8600,NULL,'{"id":"xrfragments/#1/fontmap.glb","storage":"library_6","metadata":{"filename":"fontmap.glb","size":8600,"mime_type":"model/gltf-binary","ctime":"2025-08-11T07:14:35.337+00:00","mtime":"2025-08-11T07:14:35.338+00:00","remote_etag":null,"remote_last_modified":null}}','mlv2qfcv99s1',0); -INSERT INTO model_files VALUES(2,'datapackage.json',1,'2025-08-11 07:14:39.060349','2025-08-11 13:42:56.905818',0,0,NULL,NULL,NULL,1967,NULL,'{"id":"xrfragments/#1/datapackage.json","storage":"library_6","metadata":{"filename":null,"size":1967,"mime_type":"application/json","ctime":"2025-08-11T13:42:56.859+00:00","mtime":"2025-08-11T13:42:56.867+00:00","remote_etag":null,"remote_last_modified":null}}','d44635nm6z3k',0); -INSERT INTO model_files VALUES(7,'tree.glb',1,'2025-08-11 07:29:50.850906','2025-08-11 07:29:57.592832',0,0,'79f2f9dc9c771bcbed1fc18285eeebd420b7f33446b7b7cb7453d34a5566318db0920e97835e385f270321b901b76dc3eab12eb8b895eabc321326738ba2a249',NULL,NULL,6764,NULL,'{"id":"xrfragments/#1/tree.glb","storage":"library_6","metadata":{"filename":"tree.glb","size":6764,"mime_type":"model/gltf-binary","ctime":"2025-08-11T07:29:50.913+00:00","mtime":"2025-08-11T07:29:50.914+00:00","remote_etag":null,"remote_last_modified":null}}','1hmcw2bnbh7x',0); -INSERT INTO model_files VALUES(8,'assets.webp',1,'2025-08-11 13:42:47.085596','2025-08-11 13:42:57.003069',0,0,'1090220f0d208cc142a1025818cb11e8692a58b21aff9d7156eaa40ecd2566389f8a434bc15c9d192574d847ff14efd7b35edc9c3655ea90b0c8a4bb4072b0c4',NULL,NULL,90642,NULL,'{"id":"xrfragments/#1/assets.webp","storage":"library_6","metadata":{"filename":"assets.webp","size":90642,"mime_type":"image/webp","ctime":"2025-08-11T13:42:47.402+00:00","mtime":"2025-08-11T13:42:47.402+00:00","remote_etag":null,"remote_last_modified":null}}','4sjr984nmhtr',1); CREATE TABLE IF NOT EXISTS "altcha_solutions" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "algorithm" varchar, "challenge" varchar, "salt" varchar, "signature" varchar, "number" integer, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL); CREATE TABLE IF NOT EXISTS "models" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar NOT NULL, "path" varchar NOT NULL, "library_id" integer NOT NULL, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL, "preview_file_id" integer, "creator_id" integer, "notes" text, "caption" text, "collection_id" integer, "slug" varchar, "license" varchar, "public_id" varchar, "name_lower" varchar GENERATED ALWAYS AS (LOWER(name)) STORED, "sensitive" boolean DEFAULT 0 NOT NULL, "indexable" varchar, "ai_indexable" varchar, CONSTRAINT "fk_rails_cdf016e15c" FOREIGN KEY ("collection_id") @@ -271,9 +233,7 @@ FOREIGN KEY ("library_id") FOREIGN KEY ("creator_id") REFERENCES "creators" ("id") ); -INSERT INTO models VALUES(1,'XR Fragments assets','xrfragments/#1',6,'2025-08-11 07:14:34.789236','2025-08-11 13:42:57.006778',8,1,'','',1,'fontmap','CC-BY-SA-4.0','vrpw4zlgzzm8',0,NULL,NULL); CREATE TABLE IF NOT EXISTS "creators" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar NOT NULL, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL, "notes" text, "caption" text, "slug" varchar, "public_id" varchar, "name_lower" varchar GENERATED ALWAYS AS (LOWER(name)) STORED, "indexable" varchar, "ai_indexable" varchar); -INSERT INTO creators VALUES(1,'xrfragments','2025-08-11 07:07:58.701474','2025-08-11 07:09:11.600140',replace('XR Fragments is an open specification for hyperlinking & deeplinking 3D fileformats .\nTurn 3D files into linkable AR/VR websites .\n3D files with XR Fragments enable interoperable, networkable and interactions via so-called extras and promote URL standards .','\n',char(10)),'','xrfragments','fjb71m9sbcl0','yes',NULL); CREATE TABLE IF NOT EXISTS "collections" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar, "notes" text, "caption" text, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL, "collection_id" integer, "slug" varchar, "public_id" varchar, "name_lower" varchar GENERATED ALWAYS AS (LOWER(name)) STORED, "creator_id" integer, "indexable" varchar, "ai_indexable" varchar, CONSTRAINT "fk_rails_63724415e9" FOREIGN KEY ("collection_id") REFERENCES "collections" ("id") @@ -281,46 +241,20 @@ FOREIGN KEY ("collection_id") FOREIGN KEY ("creator_id") REFERENCES "creators" ("id") ); -INSERT INTO collections VALUES(1,'XR Fragments',replace('XR Fragments is an open specification for hyperlinking & deeplinking 3D fileformats .\nTurn 3D files into linkable AR/VR websites .\n3D files with XR Fragments enable interoperable, networkable and interactions via so-called extras and promote URL standards .','\n',char(10)),'3D assets which are XR Fragment-compatible.','2025-08-11 07:08:57.465310','2025-08-11 07:09:26.849151',NULL,'xr-fragments','z924drvlr4k1',1,NULL,NULL); -INSERT INTO sqlite_sequence VALUES('libraries',6); -INSERT INTO sqlite_sequence VALUES('tags',1); -INSERT INTO sqlite_sequence VALUES('taggings',1); -INSERT INTO sqlite_sequence VALUES('links',1); -INSERT INTO sqlite_sequence VALUES('settings',24); -INSERT INTO sqlite_sequence VALUES('problems',2); -INSERT INTO sqlite_sequence VALUES('roles',4); +DELETE FROM sqlite_sequence; +INSERT INTO sqlite_sequence VALUES('taggings',0); INSERT INTO sqlite_sequence VALUES('users',1); -INSERT INTO sqlite_sequence VALUES('federails_activities',7); -INSERT INTO sqlite_sequence VALUES('caber_relations',8); -INSERT INTO sqlite_sequence VALUES('comments',2); -INSERT INTO sqlite_sequence VALUES('federails_actors',4); -INSERT INTO sqlite_sequence VALUES('model_files',8); -INSERT INTO sqlite_sequence VALUES('models',1); -INSERT INTO sqlite_sequence VALUES('creators',1); -INSERT INTO sqlite_sequence VALUES('collections',1); -INSERT INTO sqlite_sequence VALUES('libraries',6); -INSERT INTO sqlite_sequence VALUES('settings',24); -INSERT INTO sqlite_sequence VALUES('roles',4); -INSERT INTO sqlite_sequence VALUES('users',1); -INSERT INTO sqlite_sequence VALUES('federails_actors',4); -INSERT INTO sqlite_sequence VALUES('taggings',1); -INSERT INTO sqlite_sequence VALUES('users',1); -INSERT INTO sqlite_sequence VALUES('comments',2); +INSERT INTO sqlite_sequence VALUES('comments',0); INSERT INTO sqlite_sequence VALUES('oauth_access_grants',0); INSERT INTO sqlite_sequence VALUES('oauth_access_tokens',0); INSERT INTO sqlite_sequence VALUES('federails_actors',1); -INSERT INTO sqlite_sequence VALUES('model_files',7); -INSERT INTO sqlite_sequence VALUES('models',1); -INSERT INTO sqlite_sequence VALUES('creators',1); -INSERT INTO sqlite_sequence VALUES('collections',1); +INSERT INTO sqlite_sequence VALUES('model_files',0); +INSERT INTO sqlite_sequence VALUES('models',0); +INSERT INTO sqlite_sequence VALUES('creators',0); +INSERT INTO sqlite_sequence VALUES('collections',0); INSERT INTO sqlite_sequence VALUES('roles',4); -INSERT INTO sqlite_sequence VALUES('libraries',6); -INSERT INTO sqlite_sequence VALUES('settings',24); -INSERT INTO sqlite_sequence VALUES('caber_relations',8); -INSERT INTO sqlite_sequence VALUES('links',1); -INSERT INTO sqlite_sequence VALUES('federails_activities',6); -INSERT INTO sqlite_sequence VALUES('tags',1); -INSERT INTO sqlite_sequence VALUES('problems',2); +INSERT INTO sqlite_sequence VALUES('libraries',5); +INSERT INTO sqlite_sequence VALUES('settings',17); CREATE UNIQUE INDEX "index_tags_on_name" ON "tags" ("name"); CREATE UNIQUE INDEX "taggings_idx" ON "taggings" ("tag_id", "taggable_id", "taggable_type", "context", "tagger_id", "tagger_type"); CREATE INDEX "taggings_taggable_context_idx" ON "taggings" ("taggable_id", "taggable_type", "context"); @@ -411,5 +345,4 @@ CREATE INDEX "index_creators_on_created_at" ON "creators" ("created_at"); CREATE INDEX "index_creators_on_updated_at" ON "creators" ("updated_at"); CREATE INDEX "index_collections_on_created_at" ON "collections" ("created_at"); CREATE INDEX "index_collections_on_updated_at" ON "collections" ("updated_at"); -CREATE INDEX "index_links_on_url" ON "links" ("url"); COMMIT; diff --git a/manyfold/mnt/assets/xrfragment/#1 b/manyfold/mnt/assets/xrfragment/#1 new file mode 120000 index 0000000..a4dcea9 --- /dev/null +++ b/manyfold/mnt/assets/xrfragment/#1 @@ -0,0 +1 @@ +../../../xrfragment/assets \ No newline at end of file diff --git a/manyfold/mnt/experiences/xrfragments/#1.zip b/manyfold/mnt/experiences/xrfragments/#1.zip deleted file mode 100644 index 0f43ce6..0000000 Binary files a/manyfold/mnt/experiences/xrfragments/#1.zip and /dev/null differ diff --git a/manyfold/mnt/experiences/xrfragments/#1/assets.webp b/manyfold/mnt/experiences/xrfragments/#1/assets.webp deleted file mode 100644 index bb8c28a..0000000 Binary files a/manyfold/mnt/experiences/xrfragments/#1/assets.webp and /dev/null differ diff --git a/manyfold/mnt/experiences/xrfragments/#1/datapackage.json b/manyfold/mnt/experiences/xrfragments/#1/datapackage.json deleted file mode 100644 index 8b7f2bf..0000000 --- a/manyfold/mnt/experiences/xrfragments/#1/datapackage.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "$schema": "https://manyfold.app/profiles/0.0/datapackage.json", - "name": "xr-fragments-assets", - "title": "XR Fragments assets", - "caption": "", - "description": "", - "homepage": "http://localhost:3214/models/vrpw4zlgzzm8", - "image": "assets.webp", - "keywords": [ - "fontmap" - ], - "licenses": [ - { - "name": "CC-BY-SA-4.0", - "path": "https://spdx.org/licenses/CC-BY-SA-4.0.html" - } - ], - "resources": [ - { - "name": "fontmap", - "path": "fontmap.glb", - "mediatype": "model/gltf", - "up": "+z", - "presupported": false - }, - { - "name": "tree", - "path": "tree.glb", - "mediatype": "model/gltf", - "up": "+z", - "presupported": false - }, - { - "name": "assets", - "path": "assets.webp", - "mediatype": "image/webp", - "up": "+z", - "presupported": false - } - ], - "sensitive": false, - "contributors": [ - { - "title": "xrfragments", - "path": "http://localhost:3214/creators/xrfragments", - "roles": [ - "creator" - ], - "caption": "", - "description": "XR Fragments is an open specification for hyperlinking & deeplinking 3D fileformats .\nTurn 3D files into linkable AR/VR websites .\n3D files with XR Fragments enable interoperable, networkable and interactions via so-called extras and promote URL standards .", - "links": [ - { - "path": "https://xrfragment.org" - } - ] - } - ], - "collections": [ - { - "title": "XR Fragments", - "path": "http://localhost:3214/collections/z924drvlr4k1", - "caption": "3D assets which are XR Fragment-compatible.", - "description": "XR Fragments is an open specification for hyperlinking & deeplinking 3D fileformats .\nTurn 3D files into linkable AR/VR websites .\n3D files with XR Fragments enable interoperable, networkable and interactions via so-called extras and promote URL standards .", - "links": [] - } - ], - "links": [] -} \ No newline at end of file diff --git a/manyfold/mnt/experiences/xrfragments/#1/fontmap.glb b/manyfold/mnt/experiences/xrfragments/#1/fontmap.glb deleted file mode 100644 index aee2090..0000000 Binary files a/manyfold/mnt/experiences/xrfragments/#1/fontmap.glb and /dev/null differ diff --git a/manyfold/mnt/experiences/xrfragments/#1/tree.glb b/manyfold/mnt/experiences/xrfragments/#1/tree.glb deleted file mode 100644 index b605f56..0000000 Binary files a/manyfold/mnt/experiences/xrfragments/#1/tree.glb and /dev/null differ diff --git a/nix/docker.nix b/nix/docker.nix index 4d20c55..27ccb70 100644 --- a/nix/docker.nix +++ b/nix/docker.nix @@ -23,11 +23,11 @@ let # $ nix-shell -p nix-prefetch-docker --run 'nix-prefetch-docker ghcr.io/manyfold3d/manyfold-solo 0.120.0' manyfoldImage = pkgs.dockerTools.pullImage { - imageName = "ghcr.io/manyfold3d/manyfold-solo"; - imageDigest = "sha256:84524b9cf8c8e6467ca4938e58ff65a2a5d8c507fd44e7056003b3e2dcffb266"; - sha256 = "0sb4icq19vqsnhi01jbaqqr2k66bfma08hp0rm0y4hdnbqsscxvd"; - finalImageName = "ghcr.io/manyfold3d/manyfold-solo"; - finalImageTag = "0.120.0"; + imageName = "ghcr.io/manyfold3d/manyfold-solo"; + imageDigest = "sha256:6250e562a05bf9476ddcfdc897a7b03cbf2090c727d9fe051afde486579b54a6"; + sha256 = "sha256-V5y1N0l4JQjVDQbboGYX15MQaImXtP/HpNwPjDtxeJQ="; + finalImageName = "ghcr.io/manyfold3d/manyfold-solo"; + finalImageTag = "0.121.0"; }; in