AFFiNE icon indicating copy to clipboard operation
AFFiNE copied to clipboard

​Failed to send invite email

Open fish-uncle opened this issue 11 months ago • 40 comments

What happened?

services:
  affine:
    image: ghcr.io/toeverything/affine-graphql:canary
    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
      - /volume1/docker/affine/config:/root/.affine/config
      # blob storage
      - /volume1/docker/affine/storage:/root/.affine/storage
    #logging:
      #driver: 'json-file'
      #options:
        #max-size: '1000m'
    restart: unless-stopped
    environment:
      #- NODE_OPTIONS=--es-module-specifier-resolution=node
      - 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_PASSWORD=***
      #- SERVER_FLAVOR=selfhosted
  redis:
    image: redis
    container_name: affine_redis
    restart: unless-stopped
    volumes:
      - /volume1/docker/affine/redis:/data
    healthcheck:
      test: ['CMD', 'redis-cli', '--raw', 'incr', 'ping']
      interval: 10s
      timeout: 5s
      retries: 5
  postgres:
    image: postgres
    container_name: affine_postgres
    restart: unless-stopped
    volumes:
      - /volume1/docker/affine/postgres:/var/lib/postgresql/data
    healthcheck:
      test: ['CMD-SHELL', 'pg_isready -U affine']
      interval: 10s
      timeout: 5s
      retries: 5
    environment:
      POSTGRES_USER: affine
      POSTGRES_PASSWORD: affine
      POSTGRES_DB: affine
      PGDATA: /var/lib/postgresql/data/pgdata

i use admin user login success i want to invite some one friend error

{
    "errors": [
        {
            "message": "Failed to send invite email. Please try again.",
            "locations": [
                {
                    "line": 3,
                    "column": 3
                }
            ],
            "path": [
                "invite"
            ],
            "extensions": {
                "code": 500,
                "status": "INTERNAL_SERVER_ERROR"
            }
        }
    ],
    "data": null
}

Distribution version

Linux

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

Chrome

Relevant log output

No response

Anything else?

By the way, I see that AFFiNE Cloud storage is 10GB, and there is a storage limit for self hosted?

Are you willing to submit a PR?

  • [ ] Yes I'd like to help by submitting a PR!

fish-uncle avatar Feb 28 '24 11:02 fish-uncle

You should need to configure the mail service on the selfhost docker, we are preparing a document about this.

EYHN avatar Feb 28 '24 11:02 EYHN

By the way, I see that AFFiNE Cloud storage is 10GB, and there is a storage limit for self hosted?

fish-uncle avatar Feb 28 '24 11:02 fish-uncle

selfhost should have unlimited storage.

I haven't tested it yet, but if you encounter storage size limitations it should be a bug and you can open an issue.

EYHN avatar Feb 29 '24 02:02 EYHN

I was able to complete this just using the GraphQL API, but it requires quite a bit of tinkering to do. Looking forward to the email documentation is completed. In short if anybody else needs it:

https://localhost:3010/graphql

Go to settings and enable:

  "request.credentials": "include"

This makes cookies work in the playground so you can login and do operations.

Sign up with a second account:

mutation {
     signUp(email: "[email protected]", name: "Second", password: "123") {
         id
     }
}

Sign into the first account and create an invite

mutation {
  signIn(email: "[email protected]", password:"123") {
    id
    name
  }
}

Find your workspace ID, in the browser make sure it's cloud synced then copy the id in the url http://localhost/workspace/<id>/

Then create an invite, this will return an ID, take note of it

mutation {
  invite(
    email: "[email protected]"
    permission: Admin
    sendInviteMail: false
    workspaceId: "xxx-xxx-xx-xxx-xxx"
  )
}

Sign into the second account

mutation {
  signIn(email: "[email protected]", password:"123") {
    id
    name
  }
}

Then accept the invite

mutation {
  acceptInviteById(
    inviteId: "copy-id-from-invite-mutation"
    sendAcceptMail: false
    workspaceId: "your-workspace-id"
  )
}

Anyway, that was my approach for now.

ecker00 avatar Mar 02 '24 10:03 ecker00

It's actually quite simple to configure the mailing service. After deployment, I took a look inside the configuration directory which includes a file named affine.env.js containing all possible environment variable keys. Here's the section responsible for getting the SMTP config:

    MAILER_HOST: 'mailer.host',
    MAILER_PORT: ['mailer.port', 'int'],
    MAILER_USER: 'mailer.auth.user',
    MAILER_PASSWORD: 'mailer.auth.pass',
    MAILER_SENDER: 'mailer.from.address',
    MAILER_SECURE: ['mailer.secure', 'boolean'],

So you just need to pass in these environment variables during startup and all should be good.

krakowski avatar Mar 04 '24 18:03 krakowski

It's actually quite simple to configure the mailing service. After deployment, I took a look inside the configuration directory which includes a file named affine.env.js containing all possible environment variable keys. Here's the section responsible for getting the SMTP config:

    MAILER_HOST: 'mailer.host',
    MAILER_PORT: ['mailer.port', 'int'],
    MAILER_USER: 'mailer.auth.user',
    MAILER_PASSWORD: 'mailer.auth.pass',
    MAILER_SENDER: 'mailer.from.address',
    MAILER_SECURE: ['mailer.secure', 'boolean'],

So you just need to pass in these environment variables during startup and all should be good.

Hi, I tried your solution but not working for me. I want to configure gmail. image image

Can you help me ?

Jycreyn avatar Mar 05 '24 10:03 Jycreyn

@Jycreyn I managed to get the mailing service working with Gmail.

You have the MAILER_HOST and MAILER_PORT correct. MAILER_USER needs to be your email address MAILER_PASSWORD is the app password that I set using this docs: https://support.google.com/accounts/answer/185833?hl=en I didn't have to set MAILER_SENDER.

yurisasc avatar Mar 05 '24 11:03 yurisasc

@yurisasc

Yeah, I used app password. You did not use "MAIL_SECURE" either ?

thanks

Jycreyn avatar Mar 05 '24 11:03 Jycreyn

@Jycreyn no, I didn't

yurisasc avatar Mar 05 '24 11:03 yurisasc

@yurisasc

you left spaces in the password ?

Jycreyn avatar Mar 05 '24 11:03 Jycreyn

@Jycreyn no, the password should be the 16 digits characters without spaces.

yurisasc avatar Mar 05 '24 11:03 yurisasc

@yurisasc

image

And not working

password is the 16 digit without the spacesn user is my email.

Anything wrong ?

Need to add something in docker compose ?

Jycreyn avatar Mar 05 '24 11:03 Jycreyn

@Jycreyn did you add those environment variable to your docker compose file? It should look like this for the environment variable of the affine container:

    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}
      - AFFINE_SERVER_HOST=${AFFINE_SERVER_HOST}
      - AFFINE_SERVER_PORT=${AFFINE_SERVER_PORT}
      - AFFINE_SERVER_HTTPS=${AFFINE_SERVER_HTTPS}
      - MAILER_HOST=${MAILER_HOST}
      - MAILER_PORT=${MAILER_PORT}
      - MAILER_USER=${MAILER_USER}
      - MAILER_PASSWORD=${MAILER_PASSWORD}

yurisasc avatar Mar 05 '24 12:03 yurisasc

@yurisasc

Mhh no, i forgot to put it in docker compose. fck me ...

I see "affine server https" u managed to put it in HTTPS without reverse proxy ?

Jycreyn avatar Mar 05 '24 12:03 Jycreyn

@yurisasc

Okay mailer is working I can invite people !!

Thank you !

I'm missing something about HTTPS, i put the AFFINE_SERVER_HTTPS to true but not working; SSL error it's still in HTTP. What do i need to add ? image

And also maybe you know, i can only have 3 members ? even in self host ? and for storage the same limited to 10gb in self?

Again thank you so much for you'r help

Jycreyn avatar Mar 05 '24 12:03 Jycreyn

@Jycreyn Ah, I forgot to exclude those variables in my example. AFFINE_SERVER_HOST, AFFINE_SERVER_PORT, and AFFINE_SERVER_HTTPS are extra variables that I added myself and are not related to the mailing service.

To answer your question, yes. I use Cloudflared to expose my AFFiNE container publicly using my own domain, and it works with HTTPS; hence the extra variables above. It is out of the topic of this issue, so I will just add the docs here.

https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/

yurisasc avatar Mar 05 '24 12:03 yurisasc

@Jycreyn As for the members limit, I only added one other member and haven't added more. You can try adding more and let me know how it goes :). Also, I'm not sure about the storage limit.

yurisasc avatar Mar 05 '24 12:03 yurisasc

It's actually quite simple to configure the mailing service. After deployment, I took a look inside the configuration directory which includes a file named affine.env.js containing all possible environment variable keys. Here's the section responsible for getting the SMTP config:

    MAILER_HOST: 'mailer.host',
    MAILER_PORT: ['mailer.port', 'int'],
    MAILER_USER: 'mailer.auth.user',
    MAILER_PASSWORD: 'mailer.auth.pass',
    MAILER_SENDER: 'mailer.from.address',
    MAILER_SECURE: ['mailer.secure', 'boolean'],

So you just need to pass in these environment variables during startup and all should be good.

you sure these configuration items are included? didn't see it in this link https://docs.affine.pro/docs/self-host-affine

fish-uncle avatar Mar 06 '24 01:03 fish-uncle

you sure these configuration items are included? didn't see it in this link https://docs.affine.pro/docs/self-host-affine

Yes, those are the environment variables accessed by the app. We can add that to the container environment variables, and the app will be able to use them. We just need to add those in the docs, as it seems like it's still in progress.

yurisasc avatar Mar 06 '24 02:03 yurisasc

We have a new document about all configurable environment variables.

https://docs.affine.pro/docs/self-host-affine/run-affine-with-custom-options

EYHN avatar Mar 06 '24 10:03 EYHN

services:
  affine:
    image: ghcr.io/toeverything/affine-graphql:canary
    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
      - /volume1/docker/affine/config:/root/.affine/config
      # blob storage
      - /volume1/docker/affine/storage:/root/.affine/storage
    #logging:
      #driver: 'json-file'
      #options:
        #max-size: '1000m'
    restart: unless-stopped
    environment:
      #- NODE_OPTIONS=--es-module-specifier-resolution=node
      - 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_SERVER_HTTPS=false
      - AFFINE_ADMIN_EMAIL=***
      - AFFINE_ADMIN_PASSWORD=***
      #- SERVER_FLAVOR=selfhosted
      - MAILER_HOST=smtp.163.com
      - MAILER_PORT=25
      - MAILER_USER=***
      - MAILER_PASSWORD=***
  redis:
    image: redis
    container_name: affine_redis
    restart: unless-stopped
    volumes:
      - /volume1/docker/affine/redis:/data
    healthcheck:
      test: ['CMD', 'redis-cli', '--raw', 'incr', 'ping']
      interval: 10s
      timeout: 5s
      retries: 5
  postgres:
    image: postgres
    container_name: affine_postgres
    restart: unless-stopped
    volumes:
      - /volume1/docker/affine/postgres:/var/lib/postgresql/data
    healthcheck:
      test: ['CMD-SHELL', 'pg_isready -U affine']
      interval: 10s
      timeout: 5s
      retries: 5
    environment:
      POSTGRES_USER: affine
      POSTGRES_PASSWORD: affine
      POSTGRES_DB: affine
      PGDATA: /var/lib/postgresql/data/pgdata

send email error

{
    "errors": [
        {
            "message": "Failed to send invite email. Please try again.",
            "locations": [
                {
                    "line": 3,
                    "column": 3
                }
            ],
            "path": [
                "invite"
            ],
            "extensions": {
                "code": 500,
                "status": "INTERNAL_SERVER_ERROR"
            }
        }
    ],
    "data": null
}

use /graphql same error

fish-uncle avatar Mar 07 '24 08:03 fish-uncle

@fish-uncle Sorry for the late reply.

According to this error, there may be a issue with your email configuration.

Are there any relevant error logs on the server?

Use docker compose tail to check the server logs.

EYHN avatar Mar 09 '24 09:03 EYHN

services:
  affine:
    image: ghcr.io/toeverything/affine-graphql:canary
    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
      - /volume1/docker/affine/config:/root/.affine/config
      # blob storage
      - /volume1/docker/affine/storage:/root/.affine/storage
    #logging:
      #driver: 'json-file'
      #options:
        #max-size: '1000m'
    restart: unless-stopped
    environment:
      #- NODE_OPTIONS=--es-module-specifier-resolution=node
      - 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_SERVER_HTTPS=false
      - AFFINE_ADMIN_EMAIL=***
      - AFFINE_ADMIN_PASSWORD=***
      #- SERVER_FLAVOR=selfhosted
      - MAILER_HOST=smtp.163.com
      - MAILER_PORT=25
      - MAILER_USER=***
      - MAILER_PASSWORD=***
  redis:
    image: redis
    container_name: affine_redis
    restart: unless-stopped
    volumes:
      - /volume1/docker/affine/redis:/data
    healthcheck:
      test: ['CMD', 'redis-cli', '--raw', 'incr', 'ping']
      interval: 10s
      timeout: 5s
      retries: 5
  postgres:
    image: postgres
    container_name: affine_postgres
    restart: unless-stopped
    volumes:
      - /volume1/docker/affine/postgres:/var/lib/postgresql/data
    healthcheck:
      test: ['CMD-SHELL', 'pg_isready -U affine']
      interval: 10s
      timeout: 5s
      retries: 5
    environment:
      POSTGRES_USER: affine
      POSTGRES_PASSWORD: affine
      POSTGRES_DB: affine
      PGDATA: /var/lib/postgresql/data/pgdata

send email error

{
    "errors": [
        {
            "message": "Failed to send invite email. Please try again.",
            "locations": [
                {
                    "line": 3,
                    "column": 3
                }
            ],
            "path": [
                "invite"
            ],
            "extensions": {
                "code": 500,
                "status": "INTERNAL_SERVER_ERROR"
            }
        }
    ],
    "data": null
}

use /graphql same error

I noticed that you are using a consumer-grade email provider.

For this type of email provider (including gmail, outlook, etc.), if you want to directly use the username-password method, you need to generate an "application-specific password".

For Google , you can generate here: https://myaccount.google.com/apppasswords

For other email providers, you may need to find related options in the settings

darkskygit avatar Mar 11 '24 13:03 darkskygit

Just me,I have set up email information in my configuration file and environment variables in my dockercompose file, but why does my mail function keep reporting errors ”but successfully revoked permission: Error: Mailer service is not configured“ vim ~/.affine/self-host/config/affine.env.js AFFINE_SERVER_PORT: ['port', 'int'], AFFINE_SERVER_HOST: 'host', AFFINE_SERVER_SUB_PATH: 'path', AFFINE_SERVER_HTTPS: ['https', 'boolean'], DATABASE_URL: 'db.url', ENABLE_CAPTCHA: ['auth.captcha.enable', 'boolean'], CAPTCHA_TURNSTILE_SECRET: ['auth.captcha.turnstile.secret', 'string'], OAUTH_GOOGLE_CLIENT_ID: 'plugins.oauth.providers.google.clientId', OAUTH_GOOGLE_CLIENT_SECRET: 'plugins.oauth.providers.google.clientSecret', OAUTH_GITHUB_CLIENT_ID: 'plugins.oauth.providers.github.clientId', OAUTH_GITHUB_CLIENT_SECRET: 'plugins.oauth.providers.github.clientSecret', MAILER_HOST: 'smtp.qq.com', MAILER_PORT: ['465', 'int'], MAILER_USER: '[email protected]', MAILER_PASSWORD: 'fasdfdasfasdff', MAILER_SENDER: 'mailer.from.address', THROTTLE_TTL: ['rateLimiter.ttl', 'int'], THROTTLE_LIMIT: ['rateLimiter.limit', 'int'], REDIS_SERVER_HOST: 'plugins.redis.host', REDIS_SERVER_PORT: ['plugins.redis.port', 'int'], REDIS_SERVER_USER: 'plugins.redis.username', REDIS_SERVER_PASSWORD: 'plugins.redis.password', REDIS_SERVER_DATABASE: ['plugins.redis.db', 'int'], DOC_MERGE_INTERVAL: ['doc.manager.updatePollInterval', 'int'], DOC_MERGE_USE_JWST_CODEC: [ 'doc.manager.experimentalMergeWithYOcto', 'boolean', ],

vim compose.yaml affine: image: ghcr.io/toeverything/affine-graphql:stable 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 - ~/.affine/self-host/config:/root/.affine/config # blob storage - ~/.affine/self-host/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 - MAILER_HOST=${MAILER_HOST} - MAILER_PORT=${MAILER_PORT} - MAILER_USER=${MAILER_USER} - MAILER_PASSWORD=${MAILER_PASSWORD}

vitaaaaa1 avatar Apr 15 '24 10:04 vitaaaaa1

Hello, guys, it seems that old method to add users no longer working. I can't call SignUp anymore, there's no such mutation in API. How do you add users now via GraphQL?

YourDaniel avatar May 20 '24 14:05 YourDaniel

Would love to know, can't invite anyone to my workspace :(

Meabo avatar May 21 '24 16:05 Meabo

@Jycreyn @yurisasc Struggling from a while, I put the value in the .env file and compose as links to them but it says mailer service not configured. The variables are also not being read from some reason, says variable is empty even though its populated.

Populating the values in the compose file doesn't help either. Could you please help?

AndyPro720 avatar Jun 03 '24 09:06 AndyPro720

@AndyPro720 I think affine currently does not read a .env file by itself, you'll have to do the following (at least it works for me this way)

  1. Populate your .env with the variables you want to use, for example:
MAILER_HOST=my-host.com
MAILER_PORT=465
[email protected]
[email protected]
MAILER_SECURE=true
  1. Pass the variables to the affine service in docker-compose.yml:
[...]
environment:
 - MAILER_HOST=${MAILER_HOST}
 - MAILER_PORT=${MAILER_PORT}
 - MAILER_USER=${MAILER_USER}
 - MAILER_PASSWORD=${MAILER_PASSWORD}
  1. This might not be necessary if your file is named .env but it doesn't hurt to be specific: Start your service with the --env-file parameter:
docker compose --file docker-compose.yml --env-file .env up

For debugging, you can run

docker compose --file docker-compose.yml --env-file .env config

this should print out your "resolved" config file → the variables from the .env file should show up here

thomasaull avatar Jun 03 '24 09:06 thomasaull

@thomasaull Thank you so much for your detailed reply! So as it turns out, on finder reading, docker compose reads env files only in the same directory hence, it wasn't fetching the values. I did that and create an env file and while it doesn't throw any error on starting the container, the mail server not configured error still persists.

Any Ideas? Just to confirm, the app password generated from gmail has to typed in no spaces right?

AndyPro720 avatar Jun 03 '24 10:06 AndyPro720

@AndyPro720 Unfortunately I'm out of ideas then, it did work for me after I set it up like in my previous reply. In some cases (don't ask me exactly which ones) you'll need to put your values in quotes in your .env file, I had issues with this in the past. Anything with spaces and certain special characters I guess, maybe for debugging just put everything in quotes. Example:

MAILER_PASSWORD="my password @#$*)&$@"

thomasaull avatar Jun 03 '24 10:06 thomasaull