AFFiNE icon indicating copy to clipboard operation
AFFiNE copied to clipboard

[Bug]: Latest stable Docker image(ghcr.io/toeverything/affine-graphql:stable-512a908@sha256:7cf8451092ca123a9d7d7381eff2f9b8121ece16efd9e5b8a503886a244abc62) fails to start

Open attorneyatlaw opened this issue 6 months ago • 9 comments

What happened?

After upgrading to the latest ghcr.io/toeverything/affine:stable Docker image(ghcr.io/toeverything/affine-graphql:stable-512a908@sha256:7cf8451092ca123a9d7d7381eff2f9b8121ece16efd9e5b8a503886a244abc62), the container fails to start with a MODULE_NOT_FOUND error.

The previous stable image(sha256:d7118f08d8ba23d1f5cc5031c492f4d0bbb487a3b9c7d551f7bcf542d0997289) worked fine using the same Docker Compose setup.

Environment

  • Host OS: Ubuntu 22.04 (ARM64)
  • Docker version: 26.1.3
  • Docker Compose version: 2.27.0
  • AFFiNE image: ghcr.io/toeverything/affine:stable (the latest stable one, 2025. 06. 10.)
  • Persistent volumes used: Yes

Part of my docker-compose.yml is like this.

services:
  affine:
    image: ghcr.io/toeverything/affine-graphql:stable
    #image: ghcr.io/toeverything/affine-graphql:stable-512a908@sha256:7cf8451092ca123a9d7d7381eff2f9b8121ece16efd9e5b8a503886a244abc62
    container_name: affine_selfhosted
    command:
      ['sh', '-c', 'node ./scripts/self-host-predeploy && node ./dist/index.js']
    ports:
      - '3010:3010'
      - '5555:5555'
    depends_on:
      redis:
        condition: service_healthy
      postgres:
        condition: service_healthy
    volumes:
      # custom configurations
      - /data/affine/config:/root/.affine/config
      # blob storage
      - /data/affine/storage:/root/.affine/storage
    logging:
      driver: 'json-file'
      options:
        max-size: '1000m'
    restart: unless-stopped
    environment:
      - NODE_OPTIONS=--import=./scripts/register.js
      - AFFINE_CONFIG_PATH=/root/.affine/config
      - REDIS_SERVER_HOST=redis
      - DATABASE_URL=postgres://affine:affine@postgres:5432/affine
      - NODE_ENV=production
      - AFFINE_ADMIN_EMAIL=${AFFINE_ADMIN_EMAIL}
      - AFFINE_ADMIN_PASSWORD=${AFFINE_ADMIN_PASSWORD}

  redis:
    image: redis
    container_name: affine_redis
    restart: unless-stopped
    volumes:
      - /data/affine/redis:/data
    healthcheck:
      test: ['CMD', 'redis-cli', '--raw', 'incr', 'ping']
      interval: 10s
      timeout: 5s
      retries: 5

  postgres:
    image: postgres:16
    container_name: affine_postgres
    restart: unless-stopped
    volumes:
      - /data/affine/postgres:/var/lib/postgresql/data
    healthcheck:
      test: ['CMD-SHELL', 'pg_isready -U affine']
      interval: 10s
      timeout: 5s
      retries: 5
    environment:

The following are the container logs from the latest stable image.


node:internal/modules/esm/resolve:275

throw new ERR_MODULE_NOT_FOUND(

      ^

Error [ERR_MODULE_NOT_FOUND]: Cannot find module '/app/scripts/register.js' imported from /app/

at finalizeResolution (node:internal/modules/esm/resolve:275:11)

at moduleResolve (node:internal/modules/esm/resolve:860:10)

at defaultResolve (node:internal/modules/esm/resolve:984:11)

at ModuleLoader.defaultResolve (node:internal/modules/esm/loader:780:12)

at #cachedDefaultResolve (node:internal/modules/esm/loader:704:25)

at ModuleLoader.resolve (node:internal/modules/esm/loader:687:38)

at ModuleLoader.getModuleJobForImport (node:internal/modules/esm/loader:305:38)

at onImport.tracePromise.__proto__ (node:internal/modules/esm/loader:643:36)

at TracingChannel.tracePromise (node:diagnostics_channel:344:14)

at ModuleLoader.import (node:internal/modules/esm/loader:642:21) {

code: 'ERR_MODULE_NOT_FOUND',

url: 'file:///app/scripts/register.js'

}

Node.js v22.16.0

node:internal/modules/esm/resolve:275

throw new ERR_MODULE_NOT_FOUND(

      ^

Error [ERR_MODULE_NOT_FOUND]: Cannot find module '/app/scripts/register.js' imported from /app/

at finalizeResolution (node:internal/modules/esm/resolve:275:11)

at moduleResolve (node:internal/modules/esm/resolve:860:10)

at defaultResolve (node:internal/modules/esm/resolve:984:11)

at ModuleLoader.defaultResolve (node:internal/modules/esm/loader:780:12)

at #cachedDefaultResolve (node:internal/modules/esm/loader:704:25)

at ModuleLoader.resolve (node:internal/modules/esm/loader:687:38)

at ModuleLoader.getModuleJobForImport (node:internal/modules/esm/loader:305:38)

at onImport.tracePromise.__proto__ (node:internal/modules/esm/loader:643:36)

at TracingChannel.tracePromise (node:diagnostics_channel:344:14)

at ModuleLoader.import (node:internal/modules/esm/loader:642:21) {

code: 'ERR_MODULE_NOT_FOUND',

url: 'file:///app/scripts/register.js'

}

Node.js v22.16.0

node:internal/modules/esm/resolve:275

throw new ERR_MODULE_NOT_FOUND(

      ^

Error [ERR_MODULE_NOT_FOUND]: Cannot find module '/app/scripts/register.js' imported from /app/

at finalizeResolution (node:internal/modules/esm/resolve:275:11)

at moduleResolve (node:internal/modules/esm/resolve:860:10)

at defaultResolve (node:internal/modules/esm/resolve:984:11)

at ModuleLoader.defaultResolve (node:internal/modules/esm/loader:780:12)

at #cachedDefaultResolve (node:internal/modules/esm/loader:704:25)

at ModuleLoader.resolve (node:internal/modules/esm/loader:687:38)

at ModuleLoader.getModuleJobForImport (node:internal/modules/esm/loader:305:38)

at onImport.tracePromise.__proto__ (node:internal/modules/esm/loader:643:36)

at TracingChannel.tracePromise (node:diagnostics_channel:344:14)

at ModuleLoader.import (node:internal/modules/esm/loader:642:21) {

code: 'ERR_MODULE_NOT_FOUND',

url: 'file:///app/scripts/register.js'

}

Node.js v22.16.0

node:internal/modules/esm/resolve:275

throw new ERR_MODULE_NOT_FOUND(

      ^

Error [ERR_MODULE_NOT_FOUND]: Cannot find module '/app/scripts/register.js' imported from /app/

at finalizeResolution (node:internal/modules/esm/resolve:275:11)

at moduleResolve (node:internal/modules/esm/resolve:860:10)

at defaultResolve (node:internal/modules/esm/resolve:984:11)

at ModuleLoader.defaultResolve (node:internal/modules/esm/loader:780:12)

at #cachedDefaultResolve (node:internal/modules/esm/loader:704:25)

at ModuleLoader.resolve (node:internal/modules/esm/loader:687:38)

at ModuleLoader.getModuleJobForImport (node:internal/modules/esm/loader:305:38)

at onImport.tracePromise.__proto__ (node:internal/modules/esm/loader:643:36)

at TracingChannel.tracePromise (node:diagnostics_channel:344:14)

at ModuleLoader.import (node:internal/modules/esm/loader:642:21) {

code: 'ERR_MODULE_NOT_FOUND',

url: 'file:///app/scripts/register.js'

}

Node.js v22.16.0

node:internal/modules/esm/resolve:275

throw new ERR_MODULE_NOT_FOUND(

      ^

Error [ERR_MODULE_NOT_FOUND]: Cannot find module '/app/scripts/register.js' imported from /app/

at finalizeResolution (node:internal/modules/esm/resolve:275:11)

at moduleResolve (node:internal/modules/esm/resolve:860:10)

at defaultResolve (node:internal/modules/esm/resolve:984:11)

at ModuleLoader.defaultResolve (node:internal/modules/esm/loader:780:12)

at #cachedDefaultResolve (node:internal/modules/esm/loader:704:25)

at ModuleLoader.resolve (node:internal/modules/esm/loader:687:38)

at ModuleLoader.getModuleJobForImport (node:internal/modules/esm/loader:305:38)

at onImport.tracePromise.__proto__ (node:internal/modules/esm/loader:643:36)

at TracingChannel.tracePromise (node:diagnostics_channel:344:14)

at ModuleLoader.import (node:internal/modules/esm/loader:642:21) {

code: 'ERR_MODULE_NOT_FOUND',

url: 'file:///app/scripts/register.js'

}

Node.js v22.16.0

Distribution version

Linux

App Version

No response

What browsers are you seeing the problem on if you're using web version?

No response

Are you self-hosting?

  • [x] Yes

Self-hosting Version

No response

Relevant log output


Anything else?

No response

attorneyatlaw avatar Jun 09 '25 23:06 attorneyatlaw

Issue Status: 🆕 *Untriaged

*🆕 Untriaged

The team has not yet reviewed the issue. We usually do it within one business day. Docs: https://github.com/toeverything/AFFiNE/blob/canary/docs/issue-triaging.md

This is an automatic reply by the bot.

affine-issue-bot[bot] avatar Jun 09 '25 23:06 affine-issue-bot[bot]

@attorneyatlaw

You need to run docker compose pull to pull the latest image update as this issue has long been fixed. Then in the same directory run docker compose up -d --force-recreate.

NorkzYT avatar Jun 09 '25 23:06 NorkzYT

@attorneyatlaw

You need to run docker compose pull to pull the latest image update as this issue has long been fixed. Then in the same directory run docker compose up -d --force-recreate.

I did like the below and I got the error in my container.

  1. docker compose down
  2. edit my docker-compose.yml to pull the latest image
  3. docker compose up -d

Could you let me know how this issues is fixed?

attorneyatlaw avatar Jun 10 '25 06:06 attorneyatlaw

Have the image line look like below. Did you run docker compose pull after you made the changes to the compose file?

https://github.com/toeverything/AFFiNE/blob/c846c57a1228af4e8b627df8696df9aabf20fb1a/.docker/selfhost/compose.yml#L4

You can take a look at the full compose file shown in the following link and see what you are missing from your own: https://github.com/toeverything/AFFiNE/blob/canary/.docker/selfhost/compose.yml

NorkzYT avatar Jun 10 '25 14:06 NorkzYT

Thanks for your comments @NorkzYT

I edited two parts in my original docker-compose.yml

and it worked.

command: ['sh', '-c', 'node ./scripts/self-host-predeploy && node ./dist/index.js']

->

command: ['sh', '-c', 'node ./scripts/self-host-predeploy && node ./dist/main.js']

  • NODE_OPTIONS=--import=./scripts/register.js

->

#- NODE_OPTIONS=--import=./scripts/register.js

services:
  affine:
    image: ghcr.io/toeverything/affine-graphql:stable
    #image: ghcr.io/toeverything/affine-graphql:stable-512a908@sha256:7cf8451092ca123a9d7d7381eff2f9b8121ece16efd9e5b8a503886a244abc62
    container_name: affine_selfhosted
    command:
      ['sh', '-c', 'node ./scripts/self-host-predeploy && node ./dist/main.js']
    ports:
      - '3010:3010'
      - '5555:5555'
    depends_on:
      redis:
        condition: service_healthy
      postgres:
        condition: service_healthy
    volumes:
      # custom configurations
      - /data/affine/config:/root/.affine/config
      # blob storage
      - /data/affine/storage:/root/.affine/storage
    logging:
      driver: 'json-file'
      options:
        max-size: '1000m'
    restart: unless-stopped
    environment:
      #- NODE_OPTIONS=--import=./scripts/register.js
      - AFFINE_CONFIG_PATH=/root/.affine/config
      - REDIS_SERVER_HOST=redis
      - DATABASE_URL=postgres://affine:affine@postgres:5432/affine
      - NODE_ENV=production
      - AFFINE_ADMIN_EMAIL=${AFFINE_ADMIN_EMAIL}
      - AFFINE_ADMIN_PASSWORD=${AFFINE_ADMIN_PASSWORD}

  redis:
    image: redis
    container_name: affine_redis
    restart: unless-stopped
    volumes:
      - /data/affine/redis:/data
    healthcheck:
      test: ['CMD', 'redis-cli', '--raw', 'incr', 'ping']
      interval: 10s
      timeout: 5s
      retries: 5

  postgres:
    image: postgres:16
    container_name: affine_postgres
    restart: unless-stopped
    volumes:
      - /data/affine/postgres:/var/lib/postgresql/data
    healthcheck:
      test: ['CMD-SHELL', 'pg_isready -U affine']
      interval: 10s
      timeout: 5s
      retries: 5
    environment:

attorneyatlaw avatar Jun 11 '25 04:06 attorneyatlaw

Thank you, @attorneyatlaw; your solution works for me as well.

amitshuklabag avatar Jun 11 '25 06:06 amitshuklabag

@attorneyatlaw I'm curious, where did you get your docker-compose.yml from?

fengmk2 avatar Jun 11 '25 07:06 fengmk2

@attorneyatlaw I'm curious, where did you get your docker-compose.yml from?

I don’t remember exactly, but I think I found it while browsing the web. Maybe from here?

https://svrforum.com/

attorneyatlaw avatar Jun 11 '25 07:06 attorneyatlaw

@attorneyatlaw

Great that it now works.

NorkzYT avatar Jun 11 '25 10:06 NorkzYT