[GH-ISSUE #1743] 'Internal server error' when viewing project imported from Trello #6472

Closed
opened 2026-04-20 17:04:28 -05:00 by GiteaMirror · 8 comments
Owner

Originally created by @cibomahto on GitHub (Nov 4, 2025).
Original GitHub issue: https://github.com/go-vikunja/vikunja/issues/1743

Description

I'm running into a could not fetch tasks, error was 'disk I/O error: permission denied' error when attempting to open a project that was imported from Trello. I've verified that there is ample room on the file system (~130G), and have been able to repeat the issue using both 'latest' and '0.24.6' tags.

The details for my host system are:

Database: sqlite
Operating system: Debian 12.12 (bare meta, x86_64)
Docker version: 28.5.1, build e180ab8
Filesystem: ext4

Steps to reproduce:

  1. In trello, generate a new API key
  2. Write the contents of docker-compose.yml and config.yml below to a drive
  3. Create the directories files/ and db/, and ensure they have the correct ownership id
  4. Configure external caddy instance to reverse proxy port 3456 to a custom domain, and add the domain to the DNS resolver (dnsmasq) on the local network
  5. Start the vikunja instance with docker compose up -d
  6. Use a web browser to connect to https://vikunja.blinkinlabs.lan, and create a user account
  7. Under settings->Import from other services click trello, then 'get started', then 'Allow', etc.
  8. Wait a few hours for the import to complete (it appears to have taken ~30 minutes). Note that there are three boards in trello: two small ones with only a few dozen tasks, and one large one with ~3000 tasks.
  9. On the vikunja home page, note that all three boards have successfully been created.
  10. Click on a smaller board, and note that it was created successfully and shows up correctly.
  11. Click on the large board, and the UI shows an error message:
    Image
  12. On the host system, check the logs using docker container logs vikunja-vikunja-1:
time=2025-11-04T12:40:36.134Z level=INFO msg="[SQL] SELECT `entity_id`, `user_id`, `kind` FROM `favorites` WHERE (entity_id = ? AND user_id = ? AND kind = ?) LIMIT 1 [5 1 2] - 108.407µs" component=database
time=2025-11-04T12:40:36.135Z level=INFO msg="GET /api/v1/labels?page=2" component=http status=200 remote_ip=172.16.1.149 latency=6.350651ms user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:144.0) Gecko/20100101 Firefox/144.0"
time=2025-11-04T12:40:36.135Z level=INFO msg="[SQL] \nWITH RECURSIVE project_hierarchy AS (\n    -- Base case: Start with the specified projects\n    SELECT\n        id,\n        parent_project_id,\n        0 AS level,\n        id AS original_project_id\n    FROM projects\n    WHERE id IN (5)\n\n    UNION ALL\n\n    -- Recursive case: Get parent projects\n    SELECT\n        p.id,\n        p.parent_project_id,\n        ph.level + 1,\n        ph.original_project_id\n    FROM projects p\n             INNER JOIN project_hierarchy ph ON p.id = ph.parent_project_id\n),\n\nsubscription_hierarchy AS (\n    -- Check for project subscriptions (including parent projects)\n    SELECT\n        s.id,\n        s.entity_type,\n        s.entity_id,\n        s.created,\n        s.user_id,\n        CASE\n            WHEN s.entity_id = ph.original_project_id THEN 1  -- Direct project match\n            ELSE ph.level + 1  -- Parent projects\n            END AS priority,\n        ph.original_project_id\n    FROM subscriptions s\n             INNER JOIN project_hierarchy ph ON s.entity_id = ph.id\n    WHERE s.entity_type = ? AND s.user_id = 1\n)\n\nSELECT\n    p.id AS original_entity_id,\n    sh.id AS subscription_id,\n    sh.entity_type,\n    sh.entity_id,\n    sh.created,\n    sh.user_id,\n    CASE\n        WHEN sh.priority = 1 THEN 'Direct Project'\n        ELSE 'Parent Project'\n        END \n\tAS subscription_level,\n    users.*\nFROM projects p\n         LEFT JOIN (\n    SELECT *,\n           ROW_NUMBER() OVER (PARTITION BY original_project_id, user_id ORDER BY priority) AS rn\n    FROM subscription_hierarchy\n) sh ON p.id = sh.original_project_id AND sh.rn = 1\n    LEFT JOIN users ON sh.user_id = users.id\nWHERE p.id IN (5)\nORDER BY p.id, sh.user_id [2] - 949.615µs" component=database
time=2025-11-04T12:40:36.137Z level=INFO msg="[SQL] SELECT `id`, `title`, `project_id`, `view_kind`, `filter`, `position`, `bucket_configuration_mode`, `bucket_configuration`, `default_bucket_id`, `done_bucket_id`, `updated`, `created` FROM `project_views` WHERE (project_id = ?) ORDER BY position asc [5] - 184.768µs" component=database
time=2025-11-04T12:40:36.138Z level=INFO msg="GET /api/v1/projects/5" component=http status=200 remote_ip=172.16.1.149 latency=8.678201ms user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:144.0) Gecko/20100101 Firefox/144.0"
time=2025-11-04T12:40:36.152Z level=INFO msg="[SQL] SELECT `id`, `title`, `project_id`, `view_kind`, `filter`, `position`, `bucket_configuration_mode`, `bucket_configuration`, `default_bucket_id`, `done_bucket_id`, `updated`, `created` FROM `project_views` WHERE (id = ? AND project_id = ?) LIMIT 1 [17 5] - 142.388µs" component=database
time=2025-11-04T12:40:36.153Z level=INFO msg="[SQL] SELECT `id`, `title`, `description`, `identifier`, `hex_color`, `owner_id`, `parent_project_id`, `is_archived`, `background_file_id`, `background_blur_hash`, `position`, `created`, `updated` FROM `projects` WHERE id=? ORDER BY position LIMIT 1 [5] - 113.545µs" component=database
time=2025-11-04T12:40:36.154Z level=INFO msg="[SQL] \nWITH RECURSIVE\n    project_hierarchy AS (\n        -- Base case: Start with the specified projects\n        SELECT id,\n               parent_project_id,\n               0  AS level,\n               id AS original_project_id\n        FROM projects\n        WHERE id IN (5)\n\n        UNION ALL\n\n        -- Recursive case: Traverse up the hierarchy\n        SELECT p.id,\n               p.parent_project_id,\n               ph.level + 1,\n               ph.original_project_id\n        FROM projects p\n                 INNER JOIN project_hierarchy ph ON p.id = ph.parent_project_id),\n\n    project_permissions AS (SELECT ph.id,\n                                   ph.original_project_id,\n                                   CASE\n                                       WHEN p.owner_id = ? THEN 2\n                                       WHEN COALESCE(ul.permission, 0) > COALESCE(tl.permission, 0) THEN ul.permission\n                                       ELSE COALESCE(tl.permission, 0)\n                                       END AS project_permission,\n            CASE\n                WHEN p.owner_id = ? THEN 1  -- Direct project ownership\n                ELSE ph.level + 1  -- Derived from parent project\n            END AS priority\n                            FROM project_hierarchy ph\n                                LEFT JOIN projects p\n                            ON ph.id = p.id\n                                LEFT JOIN users_projects ul ON ul.project_id = ph.id AND ul.user_id = ?\n                                LEFT JOIN team_projects tl ON tl.project_id = ph.id\n                                LEFT JOIN team_members tm ON tm.team_id = tl.team_id AND tm.user_id = ?\n                            WHERE p.owner_id = ? OR ul.user_id = ? OR tm.user_id = ?)\n\nSELECT ph.original_project_id AS id,\n       COALESCE(MAX(pp.project_permission), -1) AS max_permission\nFROM project_hierarchy ph\n         LEFT JOIN (SELECT *,\n                           ROW_NUMBER() OVER (PARTITION BY original_project_id ORDER BY priority) AS rn\n                    FROM project_permissions) pp ON ph.id = pp.id AND pp.rn = 1\nGROUP BY ph.original_project_id [1 1 1 1 1 1 1] - 891.442µs" component=database
time=2025-11-04T12:40:36.156Z level=INFO msg="[SQL] SELECT DISTINCT `tasks`.*, `task_positions`.`position` FROM `tasks` LEFT JOIN `task_positions` ON task_positions.task_id = tasks.id AND task_positions.project_view_id = ? LEFT JOIN `task_relations` ON tasks.id = task_relations.task_id and task_relations.relation_kind = 'parenttask' LEFT JOIN `tasks` `parent_tasks` ON task_relations.other_task_id = parent_tasks.id WHERE (tasks.project_id IN (?)) AND tasks.`done`=? AND (task_relations.id IS NULL OR (parent_tasks.project_id != tasks.project_id)) ORDER BY task_positions.`position` asc NULLS LAST, task_positions.`position` asc NULLS LAST, tasks.`id` asc NULLS LAST LIMIT 50 [17 5 false] - 379.288µs" component=database
time=2025-11-04T12:40:36.195Z level=ERROR msg="could not fetch tasks, error was 'disk I/O error: permission denied', sql: 'SELECT DISTINCT `tasks`.*, `task_positions`.`position` FROM `tasks` LEFT JOIN `task_positions` ON task_positions.task_id = tasks.id AND task_positions.project_view_id = ? LEFT JOIN `task_relations` ON tasks.id = task_relations.task_id and task_relations.relation_kind = 'parenttask' LEFT JOIN `tasks` `parent_tasks` ON task_relations.other_task_id = parent_tasks.id WHERE (tasks.project_id IN (?)) AND tasks.`done`=? AND (task_relations.id IS NULL OR (parent_tasks.project_id != tasks.project_id)) ORDER BY task_positions.`position` asc NULLS LAST, task_positions.`position` asc NULLS LAST, tasks.`id` asc NULLS LAST LIMIT 50', values: [17 5 false]"
time=2025-11-04T12:40:36.195Z level=INFO msg="GET /api/v1/projects/5/views/17/tasks?sort_by[]=position&order_by[]=asc&filter=&filter_include_nulls=false&filter_timezone=Europe%2FAmsterdam&s=&expand=subtasks&page=1" component=http status=500 remote_ip=172.16.1.149 latency=43.641969ms user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:144.0) Gecko/20100101 Firefox/144.0"

If I copy the sqlite database and open it in SQLiteStudio, the query appears to execute successfully:

Image

docker-compose.yml:

services:
  vikunja:
    image: vikunja/vikunja
    restart: unless-stopped
    environment:
      VIKUNJA_SERVICE_JWTSECRET: <secret>
      VIKUNJA_SERVICE_PUBLICURL: https://vikunja.blinkinlabs.lan
      # Note the default path is /app/vikunja/vikunja.db.
      # This config variable moves it to a different folder so you can use a volume and
      # store the database file outside the container so state is persisted even if the container is destroyed.
      VIKUNJA_DATABASE_PATH: /db/vikunja.db
    ports:
      - 3456:3456
    volumes:
      - ./files:/app/vikunja/files
      - ./db:/db
      - ./config.yml:/etc/vikunja/config.yml

config.yml:

migration:
  trello:
    # Whether to enable the trello migrator or not
    enable: true
    # The client id, required for making requests to the trello api
    # You need to register your vikunja instance at https:/ /trello.com/app-key (log in before you visit that link) to get this
    key: <secret>
    # The url where clients are redirected after they authorized Vikunja to access their trello cards.
    # This needs to match the url you entered when registering your Vikunja instance at trello.
    # This is usually the frontend url where the frontend then makes a request to /migration/trello/migrate
    # with the code obtained from the trello api.
    # Note that the vikunja frontend expects this to end on /migrate/trello.
    redirecturl: https://vikunja.blinkinlabs.lan/migrate/trello

database:
log:
  database: on
  databaselevel: DEBUG

Vikunja Version

v1.0.0-rc2

Browser and version

Firefox 144.0.2 (64-bit) on Windows

Can you reproduce the bug on the Vikunja demo site?

No

Screenshots

No response

Originally created by @cibomahto on GitHub (Nov 4, 2025). Original GitHub issue: https://github.com/go-vikunja/vikunja/issues/1743 ### Description I'm running into a ```could not fetch tasks, error was 'disk I/O error: permission denied'``` error when attempting to open a project that was imported from Trello. I've verified that there is ample room on the file system (~130G), and have been able to repeat the issue using both 'latest' and '0.24.6' tags. The details for my host system are: Database: sqlite Operating system: Debian 12.12 (bare meta, x86_64) Docker version: 28.5.1, build e180ab8 Filesystem: ext4 Steps to reproduce: 1. In trello, generate a new API key 2. Write the contents of ```docker-compose.yml``` and ```config.yml``` below to a drive 3. Create the directories files/ and db/, and ensure they have the correct ownership id 4. Configure external caddy instance to reverse proxy port 3456 to a custom domain, and add the domain to the DNS resolver (dnsmasq) on the local network 5. Start the vikunja instance with ```docker compose up -d``` 6. Use a web browser to connect to https://vikunja.blinkinlabs.lan, and create a user account 7. Under settings->Import from other services click trello, then 'get started', then 'Allow', etc. 8. Wait a few hours for the import to complete (it appears to have taken ~30 minutes). Note that there are three boards in trello: two small ones with only a few dozen tasks, and one large one with ~3000 tasks. 9. On the vikunja home page, note that all three boards have successfully been created. 10. Click on a smaller board, and note that it was created successfully and shows up correctly. 11. Click on the large board, and the UI shows an error message: <img width="1144" height="758" alt="Image" src="https://github.com/user-attachments/assets/887ddbfb-884f-44b9-a37b-41d3d4d0e543" /> 12. On the host system, check the logs using ```docker container logs vikunja-vikunja-1```: ``` time=2025-11-04T12:40:36.134Z level=INFO msg="[SQL] SELECT `entity_id`, `user_id`, `kind` FROM `favorites` WHERE (entity_id = ? AND user_id = ? AND kind = ?) LIMIT 1 [5 1 2] - 108.407µs" component=database time=2025-11-04T12:40:36.135Z level=INFO msg="GET /api/v1/labels?page=2" component=http status=200 remote_ip=172.16.1.149 latency=6.350651ms user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:144.0) Gecko/20100101 Firefox/144.0" time=2025-11-04T12:40:36.135Z level=INFO msg="[SQL] \nWITH RECURSIVE project_hierarchy AS (\n -- Base case: Start with the specified projects\n SELECT\n id,\n parent_project_id,\n 0 AS level,\n id AS original_project_id\n FROM projects\n WHERE id IN (5)\n\n UNION ALL\n\n -- Recursive case: Get parent projects\n SELECT\n p.id,\n p.parent_project_id,\n ph.level + 1,\n ph.original_project_id\n FROM projects p\n INNER JOIN project_hierarchy ph ON p.id = ph.parent_project_id\n),\n\nsubscription_hierarchy AS (\n -- Check for project subscriptions (including parent projects)\n SELECT\n s.id,\n s.entity_type,\n s.entity_id,\n s.created,\n s.user_id,\n CASE\n WHEN s.entity_id = ph.original_project_id THEN 1 -- Direct project match\n ELSE ph.level + 1 -- Parent projects\n END AS priority,\n ph.original_project_id\n FROM subscriptions s\n INNER JOIN project_hierarchy ph ON s.entity_id = ph.id\n WHERE s.entity_type = ? AND s.user_id = 1\n)\n\nSELECT\n p.id AS original_entity_id,\n sh.id AS subscription_id,\n sh.entity_type,\n sh.entity_id,\n sh.created,\n sh.user_id,\n CASE\n WHEN sh.priority = 1 THEN 'Direct Project'\n ELSE 'Parent Project'\n END \n\tAS subscription_level,\n users.*\nFROM projects p\n LEFT JOIN (\n SELECT *,\n ROW_NUMBER() OVER (PARTITION BY original_project_id, user_id ORDER BY priority) AS rn\n FROM subscription_hierarchy\n) sh ON p.id = sh.original_project_id AND sh.rn = 1\n LEFT JOIN users ON sh.user_id = users.id\nWHERE p.id IN (5)\nORDER BY p.id, sh.user_id [2] - 949.615µs" component=database time=2025-11-04T12:40:36.137Z level=INFO msg="[SQL] SELECT `id`, `title`, `project_id`, `view_kind`, `filter`, `position`, `bucket_configuration_mode`, `bucket_configuration`, `default_bucket_id`, `done_bucket_id`, `updated`, `created` FROM `project_views` WHERE (project_id = ?) ORDER BY position asc [5] - 184.768µs" component=database time=2025-11-04T12:40:36.138Z level=INFO msg="GET /api/v1/projects/5" component=http status=200 remote_ip=172.16.1.149 latency=8.678201ms user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:144.0) Gecko/20100101 Firefox/144.0" time=2025-11-04T12:40:36.152Z level=INFO msg="[SQL] SELECT `id`, `title`, `project_id`, `view_kind`, `filter`, `position`, `bucket_configuration_mode`, `bucket_configuration`, `default_bucket_id`, `done_bucket_id`, `updated`, `created` FROM `project_views` WHERE (id = ? AND project_id = ?) LIMIT 1 [17 5] - 142.388µs" component=database time=2025-11-04T12:40:36.153Z level=INFO msg="[SQL] SELECT `id`, `title`, `description`, `identifier`, `hex_color`, `owner_id`, `parent_project_id`, `is_archived`, `background_file_id`, `background_blur_hash`, `position`, `created`, `updated` FROM `projects` WHERE id=? ORDER BY position LIMIT 1 [5] - 113.545µs" component=database time=2025-11-04T12:40:36.154Z level=INFO msg="[SQL] \nWITH RECURSIVE\n project_hierarchy AS (\n -- Base case: Start with the specified projects\n SELECT id,\n parent_project_id,\n 0 AS level,\n id AS original_project_id\n FROM projects\n WHERE id IN (5)\n\n UNION ALL\n\n -- Recursive case: Traverse up the hierarchy\n SELECT p.id,\n p.parent_project_id,\n ph.level + 1,\n ph.original_project_id\n FROM projects p\n INNER JOIN project_hierarchy ph ON p.id = ph.parent_project_id),\n\n project_permissions AS (SELECT ph.id,\n ph.original_project_id,\n CASE\n WHEN p.owner_id = ? THEN 2\n WHEN COALESCE(ul.permission, 0) > COALESCE(tl.permission, 0) THEN ul.permission\n ELSE COALESCE(tl.permission, 0)\n END AS project_permission,\n CASE\n WHEN p.owner_id = ? THEN 1 -- Direct project ownership\n ELSE ph.level + 1 -- Derived from parent project\n END AS priority\n FROM project_hierarchy ph\n LEFT JOIN projects p\n ON ph.id = p.id\n LEFT JOIN users_projects ul ON ul.project_id = ph.id AND ul.user_id = ?\n LEFT JOIN team_projects tl ON tl.project_id = ph.id\n LEFT JOIN team_members tm ON tm.team_id = tl.team_id AND tm.user_id = ?\n WHERE p.owner_id = ? OR ul.user_id = ? OR tm.user_id = ?)\n\nSELECT ph.original_project_id AS id,\n COALESCE(MAX(pp.project_permission), -1) AS max_permission\nFROM project_hierarchy ph\n LEFT JOIN (SELECT *,\n ROW_NUMBER() OVER (PARTITION BY original_project_id ORDER BY priority) AS rn\n FROM project_permissions) pp ON ph.id = pp.id AND pp.rn = 1\nGROUP BY ph.original_project_id [1 1 1 1 1 1 1] - 891.442µs" component=database time=2025-11-04T12:40:36.156Z level=INFO msg="[SQL] SELECT DISTINCT `tasks`.*, `task_positions`.`position` FROM `tasks` LEFT JOIN `task_positions` ON task_positions.task_id = tasks.id AND task_positions.project_view_id = ? LEFT JOIN `task_relations` ON tasks.id = task_relations.task_id and task_relations.relation_kind = 'parenttask' LEFT JOIN `tasks` `parent_tasks` ON task_relations.other_task_id = parent_tasks.id WHERE (tasks.project_id IN (?)) AND tasks.`done`=? AND (task_relations.id IS NULL OR (parent_tasks.project_id != tasks.project_id)) ORDER BY task_positions.`position` asc NULLS LAST, task_positions.`position` asc NULLS LAST, tasks.`id` asc NULLS LAST LIMIT 50 [17 5 false] - 379.288µs" component=database time=2025-11-04T12:40:36.195Z level=ERROR msg="could not fetch tasks, error was 'disk I/O error: permission denied', sql: 'SELECT DISTINCT `tasks`.*, `task_positions`.`position` FROM `tasks` LEFT JOIN `task_positions` ON task_positions.task_id = tasks.id AND task_positions.project_view_id = ? LEFT JOIN `task_relations` ON tasks.id = task_relations.task_id and task_relations.relation_kind = 'parenttask' LEFT JOIN `tasks` `parent_tasks` ON task_relations.other_task_id = parent_tasks.id WHERE (tasks.project_id IN (?)) AND tasks.`done`=? AND (task_relations.id IS NULL OR (parent_tasks.project_id != tasks.project_id)) ORDER BY task_positions.`position` asc NULLS LAST, task_positions.`position` asc NULLS LAST, tasks.`id` asc NULLS LAST LIMIT 50', values: [17 5 false]" time=2025-11-04T12:40:36.195Z level=INFO msg="GET /api/v1/projects/5/views/17/tasks?sort_by[]=position&order_by[]=asc&filter=&filter_include_nulls=false&filter_timezone=Europe%2FAmsterdam&s=&expand=subtasks&page=1" component=http status=500 remote_ip=172.16.1.149 latency=43.641969ms user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:144.0) Gecko/20100101 Firefox/144.0" ``` If I copy the sqlite database and open it in SQLiteStudio, the query appears to execute successfully: <img width="1855" height="343" alt="Image" src="https://github.com/user-attachments/assets/0a393ba3-98c8-4438-b761-3f08ad8c00a5" /> docker-compose.yml: ``` services: vikunja: image: vikunja/vikunja restart: unless-stopped environment: VIKUNJA_SERVICE_JWTSECRET: <secret> VIKUNJA_SERVICE_PUBLICURL: https://vikunja.blinkinlabs.lan # Note the default path is /app/vikunja/vikunja.db. # This config variable moves it to a different folder so you can use a volume and # store the database file outside the container so state is persisted even if the container is destroyed. VIKUNJA_DATABASE_PATH: /db/vikunja.db ports: - 3456:3456 volumes: - ./files:/app/vikunja/files - ./db:/db - ./config.yml:/etc/vikunja/config.yml ``` config.yml: ``` migration: trello: # Whether to enable the trello migrator or not enable: true # The client id, required for making requests to the trello api # You need to register your vikunja instance at https:/ /trello.com/app-key (log in before you visit that link) to get this key: <secret> # The url where clients are redirected after they authorized Vikunja to access their trello cards. # This needs to match the url you entered when registering your Vikunja instance at trello. # This is usually the frontend url where the frontend then makes a request to /migration/trello/migrate # with the code obtained from the trello api. # Note that the vikunja frontend expects this to end on /migrate/trello. redirecturl: https://vikunja.blinkinlabs.lan/migrate/trello database: log: database: on databaselevel: DEBUG ``` ### Vikunja Version v1.0.0-rc2 ### Browser and version Firefox 144.0.2 (64-bit) on Windows ### Can you reproduce the bug on the Vikunja demo site? No ### Screenshots _No response_
Author
Owner

@cibomahto commented on GitHub (Nov 4, 2025):

This appears to be related to: https://community.vikunja.io/t/internal-server-error-when-viewing-project-as-list-or-table/2298/11

<!-- gh-comment-id:3485959789 --> @cibomahto commented on GitHub (Nov 4, 2025): This appears to be related to: https://community.vikunja.io/t/internal-server-error-when-viewing-project-as-list-or-table/2298/11
Author
Owner

@cibomahto commented on GitHub (Nov 4, 2025):

To test whether it was related to the bind mount (which it really shouldn't be), I instead put the database in a docker volume, and ran the migration again. The migration completed successfully, however I still get the same ''disk I/O error: permission denied' error when navigating to the large project on the website, and the same error on the website.

For completeness, here is my docker compose file:

docker-compose.yml

services:
  vikunja:
    image: vikunja/vikunja
    restart: unless-stopped
    environment:
      VIKUNJA_SERVICE_JWTSECRET: qyE9FZRsWTamnYZ2TUaEyJsSbVbjuyMy
      VIKUNJA_SERVICE_PUBLICURL: https://vikunja.blinkinlabs.lan
      # Note the default path is /app/vikunja/vikunja.db.
      # This config variable moves it to a different folder so you can use a volume and
      # store the database file outside the container so state is persisted even if the container is destroyed.
      VIKUNJA_DATABASE_PATH: /vikunja_db/db/vikunja.db
    ports:
      - 3456:3456
    volumes:
      - ./files:/app/vikunja/files
      #- ./vikunja_db:/vikunja_db
      - vikunja_db:/vikunja_db
      - ./config.yml:/etc/vikunja/config.yml

volumes:
  vikunja_db:

And I needed to modify the permissions of the 'db' folder in the docker volume:

docker run \
                --mount type=volume,src=vikunja_vikunja_db,dst=/vikunja_db \
                --rm \
                --entrypoint /usr/bin/sh \
                -it \
                -it debian:12

cd /vikunja_db
mkdir db
chown 1000 db
chgrp 1000 db
<!-- gh-comment-id:3487290309 --> @cibomahto commented on GitHub (Nov 4, 2025): To test whether it was related to the bind mount (which it really shouldn't be), I instead put the database in a docker volume, and ran the migration again. The migration completed successfully, however I still get the same ''disk I/O error: permission denied' error when navigating to the large project on the website, and the same error on the website. For completeness, here is my docker compose file: docker-compose.yml ``` services: vikunja: image: vikunja/vikunja restart: unless-stopped environment: VIKUNJA_SERVICE_JWTSECRET: qyE9FZRsWTamnYZ2TUaEyJsSbVbjuyMy VIKUNJA_SERVICE_PUBLICURL: https://vikunja.blinkinlabs.lan # Note the default path is /app/vikunja/vikunja.db. # This config variable moves it to a different folder so you can use a volume and # store the database file outside the container so state is persisted even if the container is destroyed. VIKUNJA_DATABASE_PATH: /vikunja_db/db/vikunja.db ports: - 3456:3456 volumes: - ./files:/app/vikunja/files #- ./vikunja_db:/vikunja_db - vikunja_db:/vikunja_db - ./config.yml:/etc/vikunja/config.yml volumes: vikunja_db: ``` And I needed to modify the permissions of the 'db' folder in the docker volume: ``` docker run \ --mount type=volume,src=vikunja_vikunja_db,dst=/vikunja_db \ --rm \ --entrypoint /usr/bin/sh \ -it \ -it debian:12 cd /vikunja_db mkdir db chown 1000 db chgrp 1000 db ```
Author
Owner

@cibomahto commented on GitHub (Nov 4, 2025):

If I force the container to start as root user (user: 0:0), then the I/O error goes away, so it seems like it is a permissions issue with the docker image.

I saw somewhere that the I/O error could be caused by the condition where sqlite cannot create/write to a journal file, and the regular database file is still writable.

<!-- gh-comment-id:3487456460 --> @cibomahto commented on GitHub (Nov 4, 2025): If I force the container to start as root user (user: 0:0), then the I/O error goes away, so it seems like it is a permissions issue with the docker image. I saw somewhere that the I/O error could be caused by the condition where sqlite cannot create/write to a journal file, and the regular database file is still writable.
Author
Owner

@NeptunedGmbH commented on GitHub (Nov 4, 2025):

I had similar issues in a project I duplicated. I had Frontend errors my logs looked clean tho:

time=2025-11-04T21:10:16.474Z
level=INFO
msg=GET /api/v1/user
component=http
status=200
remote_ip=78.51.152.221
latency=2.680061ms
user_agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36
time=2025-11-04T21:10:16.477Z
level=INFO
msg=GET /api/v1/avatar/andreas.schaefer@neptuned.net?size=40
component=http
status=200
remote_ip=78.51.152.221
latency=3.503011ms
user_agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36
time=2025-11-04T21:10:16.493Z
level=INFO
msg=GET /assets/useCopyToClipboard-Dtv3PWON.js
component=http
status=304
remote_ip=78.51.152.221
latency=215.82µs
user_agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36
time=2025-11-04T21:10:16.494Z
level=INFO
msg=GET /assets/TaskDetailView-DPRe724l.js
component=http
status=304
remote_ip=78.51.152.221
latency=188.565µs
user_agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36
time=2025-11-04T21:10:16.494Z
level=INFO
msg=GET /assets/TaskDetailView-RuafxVAs.css
component=http
status=304
remote_ip=78.51.152.221
latency=165.719µs
user_agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36
time=2025-11-04T21:10:16.499Z
level=INFO
msg=GET /api/v1/avatar/andreas.schaefer@neptuned.net?size=40
component=http
status=200
remote_ip=78.51.152.221
latency=1.611136ms
user_agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36
time=2025-11-04T21:10:21.604Z
level=INFO
msg=GET /api/v1/notifications?page=1
component=http
status=200
remote_ip=78.51.152.221
latency=2.263365ms
user_agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36
time=2025-11-04T21:10:23.764Z
level=INFO
msg=GET /health
component=http
status=200
remote_ip=172.20.0.8
latency=12.343608ms
user_agent=Go-http-client/1.1

https://www.loom.com/share/6c56d78c46354f1e986b491454db1a9b

<!-- gh-comment-id:3488022199 --> @NeptunedGmbH commented on GitHub (Nov 4, 2025): I had similar issues in a project I duplicated. I had Frontend errors my logs looked clean tho: ``` time=2025-11-04T21:10:16.474Z level=INFO msg=GET /api/v1/user component=http status=200 remote_ip=78.51.152.221 latency=2.680061ms user_agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36 time=2025-11-04T21:10:16.477Z level=INFO msg=GET /api/v1/avatar/andreas.schaefer@neptuned.net?size=40 component=http status=200 remote_ip=78.51.152.221 latency=3.503011ms user_agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36 time=2025-11-04T21:10:16.493Z level=INFO msg=GET /assets/useCopyToClipboard-Dtv3PWON.js component=http status=304 remote_ip=78.51.152.221 latency=215.82µs user_agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36 time=2025-11-04T21:10:16.494Z level=INFO msg=GET /assets/TaskDetailView-DPRe724l.js component=http status=304 remote_ip=78.51.152.221 latency=188.565µs user_agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36 time=2025-11-04T21:10:16.494Z level=INFO msg=GET /assets/TaskDetailView-RuafxVAs.css component=http status=304 remote_ip=78.51.152.221 latency=165.719µs user_agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36 time=2025-11-04T21:10:16.499Z level=INFO msg=GET /api/v1/avatar/andreas.schaefer@neptuned.net?size=40 component=http status=200 remote_ip=78.51.152.221 latency=1.611136ms user_agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36 time=2025-11-04T21:10:21.604Z level=INFO msg=GET /api/v1/notifications?page=1 component=http status=200 remote_ip=78.51.152.221 latency=2.263365ms user_agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36 time=2025-11-04T21:10:23.764Z level=INFO msg=GET /health component=http status=200 remote_ip=172.20.0.8 latency=12.343608ms user_agent=Go-http-client/1.1 ``` https://www.loom.com/share/6c56d78c46354f1e986b491454db1a9b
Author
Owner

@cibomahto commented on GitHub (Nov 5, 2025):

I had similar issues in a project I duplicated. I had Frontend errors my logs looked clean tho:

time=2025-11-04T21:10:16.474Z
level=INFO
msg=GET /api/v1/user
component=http
status=200
remote_ip=78.51.152.221
latency=2.680061ms
user_agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36
time=2025-11-04T21:10:16.477Z
level=INFO
msg=GET /api/v1/avatar/andreas.schaefer@neptuned.net?size=40
component=http
status=200
remote_ip=78.51.152.221
latency=3.503011ms
user_agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36
time=2025-11-04T21:10:16.493Z
level=INFO
msg=GET /assets/useCopyToClipboard-Dtv3PWON.js
component=http
status=304
remote_ip=78.51.152.221
latency=215.82µs
user_agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36
time=2025-11-04T21:10:16.494Z
level=INFO
msg=GET /assets/TaskDetailView-DPRe724l.js
component=http
status=304
remote_ip=78.51.152.221
latency=188.565µs
user_agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36
time=2025-11-04T21:10:16.494Z
level=INFO
msg=GET /assets/TaskDetailView-RuafxVAs.css
component=http
status=304
remote_ip=78.51.152.221
latency=165.719µs
user_agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36
time=2025-11-04T21:10:16.499Z
level=INFO
msg=GET /api/v1/avatar/andreas.schaefer@neptuned.net?size=40
component=http
status=200
remote_ip=78.51.152.221
latency=1.611136ms
user_agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36
time=2025-11-04T21:10:21.604Z
level=INFO
msg=GET /api/v1/notifications?page=1
component=http
status=200
remote_ip=78.51.152.221
latency=2.263365ms
user_agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36
time=2025-11-04T21:10:23.764Z
level=INFO
msg=GET /health
component=http
status=200
remote_ip=172.20.0.8
latency=12.343608ms
user_agent=Go-http-client/1.1

https://www.loom.com/share/6c56d78c46354f1e986b491454db1a9b

This looks like a different issue to me, maybe open a new ticket?

<!-- gh-comment-id:3490422328 --> @cibomahto commented on GitHub (Nov 5, 2025): > I had similar issues in a project I duplicated. I had Frontend errors my logs looked clean tho: > > ``` > time=2025-11-04T21:10:16.474Z > level=INFO > msg=GET /api/v1/user > component=http > status=200 > remote_ip=78.51.152.221 > latency=2.680061ms > user_agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36 > time=2025-11-04T21:10:16.477Z > level=INFO > msg=GET /api/v1/avatar/andreas.schaefer@neptuned.net?size=40 > component=http > status=200 > remote_ip=78.51.152.221 > latency=3.503011ms > user_agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36 > time=2025-11-04T21:10:16.493Z > level=INFO > msg=GET /assets/useCopyToClipboard-Dtv3PWON.js > component=http > status=304 > remote_ip=78.51.152.221 > latency=215.82µs > user_agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36 > time=2025-11-04T21:10:16.494Z > level=INFO > msg=GET /assets/TaskDetailView-DPRe724l.js > component=http > status=304 > remote_ip=78.51.152.221 > latency=188.565µs > user_agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36 > time=2025-11-04T21:10:16.494Z > level=INFO > msg=GET /assets/TaskDetailView-RuafxVAs.css > component=http > status=304 > remote_ip=78.51.152.221 > latency=165.719µs > user_agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36 > time=2025-11-04T21:10:16.499Z > level=INFO > msg=GET /api/v1/avatar/andreas.schaefer@neptuned.net?size=40 > component=http > status=200 > remote_ip=78.51.152.221 > latency=1.611136ms > user_agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36 > time=2025-11-04T21:10:21.604Z > level=INFO > msg=GET /api/v1/notifications?page=1 > component=http > status=200 > remote_ip=78.51.152.221 > latency=2.263365ms > user_agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36 > time=2025-11-04T21:10:23.764Z > level=INFO > msg=GET /health > component=http > status=200 > remote_ip=172.20.0.8 > latency=12.343608ms > user_agent=Go-http-client/1.1 > ``` > > https://www.loom.com/share/6c56d78c46354f1e986b491454db1a9b This looks like a different issue to me, maybe open a new ticket?
Author
Owner

@cibomahto commented on GitHub (Nov 5, 2025):

For what it's worth- I switched to postgres as a database backend, which sidesteps this issue and seems to be much more performant. I'm surprised that the sqlite backend can't handle this, since my data set is quite small.

<!-- gh-comment-id:3490441586 --> @cibomahto commented on GitHub (Nov 5, 2025): For what it's worth- I switched to postgres as a database backend, which sidesteps this issue and seems to be much more performant. I'm surprised that the sqlite backend can't handle this, since my data set is quite small.
Author
Owner

@kolaente commented on GitHub (Nov 5, 2025):

I never had such problems with sqlite. Maybe your sqlite database file got corrupted? Still, if you can read it with the sqlite viewer tool, it seems to be fine. Then again, you seem to be running Vikunja on windows, which might cause issues.

Anyways, it seems like this is solved, I'll close the issue. Please ping or open a new issue if you think this is not solved adequately.

<!-- gh-comment-id:3490456194 --> @kolaente commented on GitHub (Nov 5, 2025): I never had such problems with sqlite. Maybe your sqlite database file got corrupted? Still, if you can read it with the sqlite viewer tool, it seems to be fine. Then again, you seem to be running Vikunja on windows, which might cause issues. Anyways, it seems like this is solved, I'll close the issue. Please ping or open a new issue if you think this is not solved adequately.
Author
Owner

@cibomahto commented on GitHub (Nov 5, 2025):

It's solved for me, but I am quite certain that the docker container isn't configured with correct permissions for sqlite to work correctly. The issue is repeatable on a fresh instance, where the only thing that is performed is an import from trello. The server docker host is a bare metal Debian install, not Windows.

<!-- gh-comment-id:3490478919 --> @cibomahto commented on GitHub (Nov 5, 2025): It's solved for me, but I am quite certain that the docker container isn't configured with correct permissions for sqlite to work correctly. The issue is repeatable on a fresh instance, where the only thing that is performed is an import from trello. The server docker host is a bare metal Debian install, not Windows.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: github-starred/vikunja#6472