VST Video Exporting Error

• Hardware Platform: Jetson AGX Orin
• DeepStream Version: 7.1
• JetPack Version: 6.1
• TensorRT Version:10.3
• Issue Type: Bug

Hi, I have VST (nvcr.io/nvidia/deepstream:7.1-triton-multiarch) running, almost everything works correctly. RTSP streams are being recorded in 1 minute clips as expected on disk.

However, I cannot export the clips using the API (/v1/storage/file/{streamId}). I have confirmed that the video file is there and is not corrupted. The API seems to fail as soon as it starts processing the video:

[2026-6-25T4:33:48.966Z:281468894637024:gst_utils.cpp:848: demuxer_pad_added_cb]        Received new pad video_0 from splitmuxsrc4
[2026-6-25T4:33:48.999Z:281468919999456:gst_utils.cpp:758: identity_cb_for_last_frame_timestamp]        IDR Detected : m_lastFrameTimestamp 1000951
[2026-6-25T4:33:48.999Z:281471184268256:gst_utils.cpp:1025: getInfoForTranscodingGOP]   EOS Message received
...
[2026-6-25T4:33:49.12Z:281471184268256:gst_utils.cpp:1764: downloadVideoFile]   Unable to set the pipeline to the pause state

See full log below:

[2026-6-25T4:33:48.939Z:281471184268256:storage_management_apis.cpp:220: handleStorageFileAPIrequest]   Storage Management API handler requestApi:/api/v1/storage/file/add35849-ceae-4c07-9266-eb73bbabad39 requestMethod:GET queryString:startTime=2026-06-25T02:30:01.000Z&endTime=2026-06-25T02:30:59.000Z
[2026-6-25T4:33:48.939Z:281471184268256:storage_management_apis.cpp:247: handleStorageFileAPIrequest]   API path: add35849-ceae-4c07-9266-eb73bbabad39
[2026-6-25T4:33:48.940Z:281471184268256:storage_management_apis.cpp:293: handleStorageFileAPIrequest]   2026-06-25T02:30:01.000Z 2026-06-25T02:30:59.000Z
[2026-6-25T4:33:48.940Z:281471184268256:gst_utils.cpp:1884: makeVideoFile]      Enter makeVideoFile
[2026-6-25T4:33:48.940Z:281471184268256:gst_utils.cpp:1242: downloadVideoFile]  Start Time: 2026-06-25T02:30:01.000Z End Time: 2026-06-25T02:30:59.000Z
[2026-6-25T4:33:48.940Z:281471184268256:gst_utils.cpp:1278: downloadVideoFile]  Epoch Start Time: 1782354601000
[2026-6-25T4:33:48.940Z:281471184268256:gst_utils.cpp:1283: downloadVideoFile]  Epoch End Time: 1782354659000
[2026-6-25T4:33:48.940Z:281471184268256:sqlite_helper.cpp:2363: getFileList]    DBHelper::getFileList sensor id: add35849-ceae-4c07-9266-eb73bbabad39 startTime: 1782354601000 endTime: 1782354659000
[2026-6-25T4:33:48.940Z:281471184268256:sqlite_helper.cpp:912: readVideoRecord] SQL query: SELECT * FROM VIDEO_RECORD_DETAILS WHERE STREAM_ID = "add35849-ceae-4c07-9266-eb73bbabad39" AND (START_TIME + FILE_DURATION >= 1782354601000OR START_TIME = 1782354601000 ) AND START_TIME < 1782354659000;
[2026-6-25T4:33:48.944Z:281471184268256:gst_utils.cpp:1309: downloadVideoFile]  Total files: 1
[2026-6-25T4:33:48.944Z:281471184268256:gst_utils.cpp:1310: downloadVideoFile]  File base timestamp: 1782354600092
[2026-6-25T4:33:48.944Z:281471184268256:storage_management.cpp:487: addFileInProtectList]       Added file into thein protect list filePath:/data/vst-volume/video/add35849-ceae-4c07-9266-eb73bbabad39/1920x1080/2026/06/25/3/1782354600092.mkv removeOrAdd:1
[2026-6-25T4:33:48.959Z:281471184268256:gst_utils.cpp:964: getInfoForTranscodingGOP]    Setting PAUSE State
[2026-6-25T4:33:48.960Z:281471184268256:gst_utils.cpp:976: getInfoForTranscodingGOP]    Seek Start Position = 908
[2026-6-25T4:33:48.961Z:281471184268256:gst_utils.cpp:977: getInfoForTranscodingGOP]    Seek End Position = 58908
[2026-6-25T4:33:48.966Z:281468894637024:gst_utils.cpp:848: demuxer_pad_added_cb]        Received new pad video_0 from splitmuxsrc4
[2026-6-25T4:33:48.999Z:281468919999456:gst_utils.cpp:758: identity_cb_for_last_frame_timestamp]        IDR Detected : m_lastFrameTimestamp 1000951
[2026-6-25T4:33:48.999Z:281471184268256:gst_utils.cpp:1025: getInfoForTranscodingGOP]   EOS Message received
[2026-6-25T4:33:49.10Z:281471184268256:gst_utils.cpp:1053: getInfoForTranscodingGOP]    Exiting getInfoForTranscodingGOP
[2026-6-25T4:33:49.11Z:281471184268256:gst_utils.cpp:1381: downloadVideoFile]   m_lastFrameTimestamp: 1000951 m_profile: main m_level: 5 m_tier: main
[2026-6-25T4:33:49.12Z:281471184268256:gst_utils.cpp:1693: downloadVideoFile]   Creating output file : COL - Camera1_2026-06-25T02:30:01.000Z_2026-06-25T02:30:59.000Z.ts
[2026-6-25T4:33:49.12Z:281471184268256:gst_utils.cpp:1760: downloadVideoFile]   Setting PAUSE State
[2026-6-25T4:33:49.12Z:281471184268256:gst_utils.cpp:1764: downloadVideoFile]   Unable to set the pipeline to the pause state
[2026-6-25T4:33:49.13Z:281471184268256:storage_management.cpp:487: addFileInProtectList]        Added file into thein protect list filePath:/data/vst-volume/video/add35849-ceae-4c07-9266-eb73bbabad39/1920x1080/2026/06/25/3/1782354600092.mkv removeOrAdd:0
[2026-6-25T4:33:49.29Z:281471184268256:gst_utils.cpp:1899: makeVideoFile]       Downloading video file failed
[2026-6-25T4:33:49.29Z:281471184268256:gst_utils.cpp:1902: makeVideoFile]       Exit makeVideoFile

Does VST support exporting video snippets on the Jetson platform? This post seems to suggest that it does not: Recording in VST(Video storage toolkit) . However, this fact is not claimed anywhere else that I can find. If it is meant to work please assist me in troubleshooting this issue.

Hello @jetson.developer!

Based on the title and content of your topic, it looks like it may receive better visibility and feedback in a different category. We took the liberty of moving it for you.

If this was an incorrect assessment, please send me a direct message.

Disclaimer: this moderation suggestion and message were generated with AI assistance.

Could you provide more details on how you deployed the VST and how you are using the recording function? This will help me reproduce the issue.

Since I am not sure about your specific workflow, I cannot offer any suggestions at the moment.

Hi junshengy, thanks for responding!

I have replicated the issue with the provided docker compose for the VST service. I appended -001 to the container names and storage paths to avoid any clashes whilst testing this issue, I also ensured my existing VST was down when testing. The recording function is just the default of recording everything, the ‘alwaysOn’ setting.

version: '2'
services:
  jps-init-vst-001:
    image: nvcr.io/nvidia/jps/jps-init-container:v1.0.2_arm64v8
    network_mode: "host"
    environment:
      PORTS: "6379" # "6379,30080"
    deploy:
      restart_policy:
        condition: on-failure

  vst-001:
    image: nvcr.io/nvidia/jps/vst:1.3.0-24.07.1-aarch64
    user: "2000:150"
    network_mode: "host"
    runtime: nvidia
    logging:
      driver: "json-file"
      options:
        max-size: "8192m"
        max-file: "3"
    container_name: vst
    entrypoint: sh -c '/opt/vst_release/launch_vst --debug-level 3 2>&1 | tee -a /opt/vst_release/webroot/log/vst.log'
    volumes:
      - ./config/vst_config.json:/opt/vst_release/configs/vst_config.json
      - ./config/vst_storage.json:/opt/vst_release/configs/vst_storage.json
      - /data/vst-volume-001:/data/vst-volume
      - /data/logging-volume-001:/opt/vst_release/webroot/log
      - /usr/lib/aarch64-linux-gnu/nvidia/:/usr/lib/aarch64-linux-gnu/tegra/
      - /tmp/:/tmp/
    depends_on:
        jps-init-vst-001:            
          condition: service_completed_successfully
    deploy:
      resources:
        limits:
          memory: 5600M
      restart_policy:
        condition: always

These paths retain the correct ownership:

root@jetson:/# ls -al /data 
drwxrwxr-x  2 logging logusers 4096 Jun 26 10:09 logging-volume-001
drwxr-xr-x  5 vst     logusers 4096 Jun 26 10:14 vst-volume-001

I added a RTSP stream to this test VST and can see the stream in the web interface and with:

curl -X GET "http://localhost:30080/vst/api/v1/sensor/streams"
[
        {
                "620f0791-4abc-46c5-862b-730a948be047" : 
                [
                        {
                                "isMain" : true,
                                "metadata" : 
                                {
                                        "bitrate" : "",
                                        "codec" : "H265",
                                        "framerate" : "25.000000",
                                        "govlength" : "",
                                        "resolution" : "1920x1080"
                                },
                                "name" : "SENSOR",
                                "streamId" : "620f0791-4abc-46c5-862b-730a948be047",
                                "url" : "rtsp://192.168.1.102:8554/live/620f0791-4abc-46c5-862b-730a948be047"
                        }
                ]
        }
]

I call the API with:

curl -X GET "http://localhost:30080/vst/api/v1/storage/file/620f0791-4abc-46c5-862b-730a948be047" \
  -G \
  --data-urlencode "startTime=2026-06-26T01:11:01.000Z" \
  --data-urlencode "endTime=2026-06-26T01:11:59.000Z"

OR

http://localhost:30080/vst/api/v1/storage/file/620f0791-4abc-46c5-862b-730a948be047?startTime=2026-06-26T01:11:01.000Z&endTime=2026-06-26T01:11:59.000Z

and receive:

{
        "error_code" : "VMSInternalError",
        "error_message" : "Unable to get requested file, please try after sometime"
}

The logs show:

[2026-6-26T1:13:38.463Z:281470706052064:storage_management_apis.cpp:220: handleStorageFileAPIrequest]   Storage Management API handler requestApi:/api/v1/storage/file/620f0791-4abc-46c5-862b-730a948be047 requestMethod:GET queryString:startTime=2026-06-26T01%3a11%3a01.000Z&endTime=2026-06-26T01%3a11%3a59.000Z
[2026-6-26T1:13:38.463Z:281470706052064:storage_management_apis.cpp:247: handleStorageFileAPIrequest]   API path: 620f0791-4abc-46c5-862b-730a948be047
[2026-6-26T1:13:38.464Z:281470706052064:storage_management_apis.cpp:293: handleStorageFileAPIrequest]   2026-06-26T01:11:01.000Z 2026-06-26T01:11:59.000Z
[2026-6-26T1:13:38.464Z:281470706052064:gst_utils.cpp:1884: makeVideoFile]      Enter makeVideoFile
[2026-6-26T1:13:38.464Z:281470706052064:gst_utils.cpp:1242: downloadVideoFile]  Start Time: 2026-06-26T01:11:01.000Z End Time: 2026-06-26T01:11:59.000Z
[2026-6-26T1:13:38.464Z:281470706052064:gst_utils.cpp:1278: downloadVideoFile]  Epoch Start Time: 1782436261000
[2026-6-26T1:13:38.464Z:281470706052064:gst_utils.cpp:1283: downloadVideoFile]  Epoch End Time: 1782436319000
[2026-6-26T1:13:38.464Z:281470706052064:sqlite_helper.cpp:2363: getFileList]    DBHelper::getFileList sensor id: 620f0791-4abc-46c5-862b-730a948be047 startTime: 1782436261000 endTime: 1782436319000
[2026-6-26T1:13:38.464Z:281470706052064:sqlite_helper.cpp:912: readVideoRecord] SQL query: SELECT * FROM VIDEO_RECORD_DETAILS WHERE STREAM_ID = "620f0791-4abc-46c5-862b-730a948be047" AND (START_TIME + FILE_DURATION >= 1782436261000OR START_TIME = 1782436261000 ) AND START_TIME < 1782436319000;
[2026-6-26T1:13:38.464Z:281470706052064:gst_utils.cpp:1309: downloadVideoFile]  Total files: 2
[2026-6-26T1:13:38.464Z:281470706052064:gst_utils.cpp:1310: downloadVideoFile]  File base timestamp: 1782436240867
[2026-6-26T1:13:38.464Z:281470706052064:storage_management.cpp:487: addFileInProtectList]       Added file into thein protect list filePath:/data/vst-volume/video/620f0791-4abc-46c5-862b-730a948be047/1920x1080/2026/06/26/2/1782436240867.mkv removeOrAdd:1
[2026-6-26T1:13:38.482Z:281470706052064:storage_management.cpp:487: addFileInProtectList]       Added file into thein protect list filePath:/data/vst-volume/video/620f0791-4abc-46c5-862b-730a948be047/1920x1080/2026/06/26/2/1782436301062.mkv removeOrAdd:1
[2026-6-26T1:13:38.510Z:281470706052064:gst_utils.cpp:964: getInfoForTranscodingGOP]    Setting PAUSE State
[2026-6-26T1:13:38.511Z:281470706052064:gst_utils.cpp:976: getInfoForTranscodingGOP]    Seek Start Position = 20133
[2026-6-26T1:13:38.511Z:281470706052064:gst_utils.cpp:977: getInfoForTranscodingGOP]    Seek End Position = 78133
[2026-6-26T1:13:38.514Z:281467028065248:gst_utils.cpp:848: demuxer_pad_added_cb]        Received new pad video_0 from splitmuxsrc32
[2026-6-26T1:13:38.533Z:281466963438560:gst_utils.cpp:758: identity_cb_for_last_frame_timestamp]        IDR Detected : m_lastFrameTimestamp 1020158
[2026-6-26T1:13:38.533Z:281470706052064:gst_utils.cpp:1025: getInfoForTranscodingGOP]   EOS Message received
[2026-6-26T1:13:38.540Z:281470706052064:gst_utils.cpp:1053: getInfoForTranscodingGOP]   Exiting getInfoForTranscodingGOP
[2026-6-26T1:13:38.540Z:281470706052064:gst_utils.cpp:1381: downloadVideoFile]  m_lastFrameTimestamp: 1020158 m_profile: main m_level: 5 m_tier: main
[2026-6-26T1:13:38.542Z:281470706052064:gst_utils.cpp:1693: downloadVideoFile]  Creating output file : SENSOR_2026-06-26T01:11:01.000Z_2026-06-26T01:11:59.000Z.ts
[2026-6-26T1:13:38.542Z:281470706052064:gst_utils.cpp:1760: downloadVideoFile]  Setting PAUSE State
[2026-6-26T1:13:38.542Z:281470706052064:gst_utils.cpp:1764: downloadVideoFile]  Unable to set the pipeline to the pause state
[2026-6-26T1:13:38.543Z:281470706052064:storage_management.cpp:487: addFileInProtectList]       Added file into thein protect list filePath:/data/vst-volume/video/620f0791-4abc-46c5-862b-730a948be047/1920x1080/2026/06/26/2/1782436240867.mkv removeOrAdd:0
[2026-6-26T1:13:38.556Z:281470706052064:storage_management.cpp:487: addFileInProtectList]       Added file into thein protect list filePath:/data/vst-volume/video/620f0791-4abc-46c5-862b-730a948be047/1920x1080/2026/06/26/2/1782436301062.mkv removeOrAdd:0
[2026-6-26T1:13:38.589Z:281470706052064:gst_utils.cpp:1899: makeVideoFile]      Downloading video file failed
[2026-6-26T1:13:38.589Z:281470706052064:gst_utils.cpp:1902: makeVideoFile]      Exit makeVideoFile

The 1 minute video snippets are present:

/data/vst-volume-001/video/620f0791-4abc-46c5-862b-730a948be047/
└── 1920x1080
    └── 2026
        └── 06
            └── 26
                ├── 1
                │   ├── 1782432936166.mkv
                │   ├── 1782432996188.mkv
                │   ├── 1782433056383.mkv
                │   ├── 1782433116578.mkv
                │   ├── 1782433176775.mkv
                │   ├── 1782433236776.mkv
                │   ├── 1782433296777.mkv
                │   ├── 1782433356968.mkv
                │   ├── 1782433416968.mkv
                │   ├── 1782433477161.mkv
                │   ├── 1782433537162.mkv
                │   ├── 1782433597360.mkv
                │   ├── 1782433657559.mkv
                │   ├── 1782433717756.mkv
                │   ├── 1782433777758.mkv
                │   ├── 1782433837761.mkv
                │   ├── 1782433897779.mkv
                │   ├── 1782433957972.mkv
                │   ├── 1782434017977.mkv
                │   ├── 1782434077988.mkv
                │   ├── 1782434138187.mkv
                │   ├── 1782434198383.mkv
                │   ├── 1782434258390.mkv
                │   ├── 1782434318405.mkv
                │   ├── 1782434378416.mkv
                │   ├── 1782434438424.mkv
                │   ├── 1782434498623.mkv
                │   ├── 1782434558822.mkv
                │   ├── 1782434618825.mkv
                │   ├── 1782434678832.mkv
                │   ├── 1782434738844.mkv
                │   ├── 1782434798845.mkv
                │   ├── 1782434859044.mkv
                │   ├── 1782434919058.mkv
                │   ├── 1782434979257.mkv
                │   ├── 1782435039259.mkv
                │   ├── 1782435099259.mkv
                │   ├── 1782435159260.mkv
                │   ├── 1782435219263.mkv
                │   ├── 1782435279286.mkv
                │   ├── 1782435339296.mkv
                │   ├── 1782435399489.mkv
                │   ├── 1782435459494.mkv
                │   ├── 1782435519503.mkv
                │   └── 1782435579701.mkv
                └── 2
                    ├── 1782435639704.mkv
                    ├── 1782435699897.mkv
                    ├── 1782435760087.mkv
                    ├── 1782435820090.mkv
                    ├── 1782435880096.mkv
                    ├── 1782435940096.mkv
                    ├── 1782436000295.mkv
                    ├── 1782436060484.mkv
                    ├── 1782436120484.mkv
                    ├── 1782436180673.mkv
                    ├── 1782436240867.mkv
                    ├── 1782436301062.mkv
                    ├── 1782436361068.mkv
                    ├── 1782436421070.mkv
                    ├── 1782436481266.mkv
                    ├── 1782436541273.mkv
                    ├── 1782436601457.mkv
                    ├── 1782436661655.mkv
                    ├── 1782436721853.mkv
                    ├── 1782436782051.mkv
                    ├── 1782436842057.mkv
                    └── 1782436902061.mkv

And the files in question can be viewed in the desktop and is successfully checked (inside the container) with:

I have no name!@jetson:/opt/vst_release$ gst-launch-1.0 filesrc location=/data/vst-volume/video/620f0791-4abc-46c5-862b-730a948be047/1920x1080/2026/06/26/2/1782436240867.mkv ! matroskademux ! h265parse ! fakesink
Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...
Pipeline is PREROLLED ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
Redistribute latency...
Got EOS from element "pipeline0".
Execution ended after 0:00:00.058227669
Setting pipeline to NULL ...
Freeing pipeline ...
I have no name!@jetson:/opt/vst_release$ gst-launch-1.0 filesrc location=/data/vst-volume/video/620f0791-4abc-46c5-862b-730a948be047/1920x1080/2026/06/26/2/1782436301062.mkv ! matroskademux ! h265parse ! fakesink
Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...
Pipeline is PREROLLED ...
Setting pipeline to PLAYING ...
Redistribute latency...
New clock: GstSystemClock
Got EOS from element "pipeline0".
Execution ended after 0:00:00.051112346
Setting pipeline to NULL ...
Freeing pipeline ...

This is with the out of the box VST compose file (with only the minor changes explained above). Any video exports fail even when using the web interface. If this is expected to work please help me troubleshoot this problem.

This error is caused by insufficient permissions.Two solutions
1.

# user: "2000:150"   #  delete it
or
user: "0:0"

2.Make the /opt/vst_release volume writable.

    volumes:
      - /data/vst-release-workdir:/opt/vst_release
      - /data/vst-volume-001:/data/vst-volume
      - /data/logging-volume-001:/opt/vst_release/webroot/log
  sudo mkdir -p /data/vst-release-workdir
  sudo chown -R 2000:150 /data/vst-release-workdir

Thanks for your response, it helped me head in the right direction!

For those that follow using user: "0:0" did in fact make it work, however, I don’t like that approach. In retrospect I probably should have tried it when debugging; the VST logs didn’t hint at a permission issue so I didn’t investigate it, my mistake…

Anyway, within the container I used strace to find the permission issue:

root@jetson:/opt/vst_release# sudo -u \#2000 -g \#150 strace -f -q -e trace=open,openat,access /opt/vst_release/launch_vst 2>&1 >/dev/null | grep EACCES
[pid   739] openat(AT_FDCWD, "/root/vst_release/prebuilts/aarch64/libnvds_logger.so", O_RDONLY|O_CLOEXEC) = -1 EACCES (Permission denied)
[pid   739] openat(AT_FDCWD, "/root/vst_release/prebuilts/aarch64/libnvds_redis_proto.so", O_RDONLY|O_CLOEXEC) = -1 EACCES (Permission denied)
[pid   739] openat(AT_FDCWD, "./webroot/config.js", O_WRONLY|O_CREAT|O_TRUNC, 0666) = -1 EACCES (Permission denied)
[pid   739] openat(AT_FDCWD, "/root/vst_release/prebuilts/aarch64/libnvrtspserver.so", O_RDONLY|O_CLOEXEC) = -1 EACCES (Permission denied)
[pid   739] openat(AT_FDCWD, "/root/vst_release/prebuilts/aarch64/libnvstreamrecorder.so", O_RDONLY|O_CLOEXEC) = -1 EACCES (Permission denied)
[pid   739] openat(AT_FDCWD, "/root/vst_release/prebuilts/aarch64/libnvstoragemanagement.so", O_RDONLY|O_CLOEXEC) = -1 EACCES (Permission denied)
[pid   739] openat(AT_FDCWD, "/root/vst_release/prebuilts/aarch64/libnvsensormanagement.so", O_RDONLY|O_CLOEXEC) = -1 EACCES (Permission denied)
[pid   739] openat(AT_FDCWD, "/root/vst_release/prebuilts/aarch64/libnvds_logger.so", O_RDONLY|O_CLOEXEC) = -1 EACCES (Permission denied)
[pid   739] openat(AT_FDCWD, "/root/vst_release/prebuilts/aarch64/libnvds_redis_proto.so", O_RDONLY|O_CLOEXEC) = -1 EACCES (Permission denied)
[pid   739] openat(AT_FDCWD, "./cfg_redis.txt", O_WRONLY|O_CREAT|O_TRUNC, 0666) = -1 EACCES (Permission denied)
[pid   739] openat(AT_FDCWD, "/root/vst_release/prebuilts/aarch64/libnvpeerconnection_live.so", O_RDONLY|O_CLOEXEC) = -1 EACCES (Permission denied)
[pid   739] openat(AT_FDCWD, "/root/vst_release/prebuilts/aarch64/libnvpeerconnection_replay.so", O_RDONLY|O_CLOEXEC) = -1 EACCES (Permission denied)
[pid   739] openat(AT_FDCWD, "/root/vst_release/prebuilts/aarch64/libnvstreambridge.so", O_RDONLY|O_CLOEXEC) = -1 EACCES (Permission denied)
[pid   739] openat(AT_FDCWD, "/root/vst_release/prebuilts/aarch64/libllosd.so", O_RDONLY|O_CLOEXEC) = -1 EACCES (Permission denied)
[pid   739] openat(AT_FDCWD, "/root/vst_release/prebuilts/aarch64/libgstcuosdmeta.so", O_RDONLY|O_CLOEXEC) = -1 EACCES (Permission denied)
[pid   859] openat(AT_FDCWD, "./webroot/recording_qos_2026-06-29T00:22:49Z.csv", O_WRONLY|O_CREAT|O_APPEND, 0666) = -1 EACCES (Permission denied)
[pid   803] openat(AT_FDCWD, "disconnected_device_2026-06-26T04:01:46.606Z_2026-06-26T04:01:48.391Z.ts", O_WRONLY|O_CREAT|O_TRUNC, 0666) = -1 EACCES (Permission denied)

From this the last line is generated when I use the export API. It seems to want to create a temporary file in the binary directory. So /opt/vst_release/<here>, by default this has the following permissions:

drwxr-xr-x 1 root root 4096 Aug  1  2024 vst_release

Changing only the application directory (not recursively) fixes this issue and files can now be downloaded using the VST API:

root@jetson:/opt/vst_release# chown 2000:150  /opt/vst_release/
root@jetson:/opt/vst_release# ls -al /opt/
total 24
drwxr-xr-x 1 root   root     4096 Aug  1  2024 .
drwxr-xr-x 1 root   root     4096 Jun 29 00:14 ..
drwxr-xr-x 1 root   root     4096 Aug 19  2023 nvidia
drwxr-xr-x 1 vst    logusers 4096 Aug  1  2024 vst_release

# For this output I manually made the users/group.

On an aside, it seems that the binary looks first for the compiled libraries in the user’s home directory, I assume it finds the correct ones in /opt/vst_release/prebuilts/* after the fact (no need to verify).

It also by default is missing permissions to /opt/vst_release/webroot/config.js which the application also wants, but again I assume it must just use a default when it fails.


So to fix the issues identified here, I would recommend using a dockerfile:

FROM nvcr.io/nvidia/jps/vst:1.3.0-24.07.1-aarch64

ARG HOST_UID=2000
ARG HOST_GID=150

RUN groupadd -g ${HOST_GID} logusers && \
    useradd -m -u ${HOST_UID} -g ${HOST_GID} vst

RUN chown vst:logusers /opt/vst_release && \
    chown vst:logusers /opt/vst_release/webroot/config.js

And replace the image line in the docker compose with the build line:

# image: nvcr.io/nvidia/jps/vst:1.3.0-24.07.1-aarch64
build: 
   context: .
   dockerfile: dockerfile

You could just recursively run the one command chown -R vst:logusers /opt/vst_release instead. This may fix other issues in addition to the ones highlighted here, but for the ones specifically identified in this post the dockerfile above corrected them. I myself will just use the recursive command to hopefully avoid any other permission issues:

FROM nvcr.io/nvidia/jps/vst:1.3.0-24.07.1-aarch64

ARG HOST_UID=2000
ARG HOST_GID=150

RUN groupadd -g ${HOST_GID} logusers && \
    useradd -m -u ${HOST_UID} -g ${HOST_GID} vst

RUN chown vst:logusers -R /opt/vst_release

Please let me know if I should make any further changes!