diff --git a/.env b/.env index f0fdc51..b056469 100644 --- a/.env +++ b/.env @@ -6,13 +6,19 @@ SMTP_USERNAME= SMTP_PASSWORD= SMTP_HOST= SMTP_PORT= -NOTESNOOK_SENDER_EMAIL= -NOTESNOOK_SENDER_NAME= +NOTESNOOK_SENDER_EMAIL= # optional +NOTESNOOK_SENDER_NAME= # optional SMTP_REPLYTO_NAME= # optional SMTP_REPLYTO_EMAIL= # optional -# MessageBird is used for 2FA via SMS +# MessageBird or Twilio are used for 2FA via SMS +# You can setup either of them or none of them but keep in mind +# that 2FA via SMS will not work if you haven't set up at least +# one SMS provider. MESSAGEBIRD_ACCESS_KEY= +TWILIO_ACCOUNT_SID= +TWILIO_AUTH_TOKEN= +TWILIO_SERVICE_SID= # Server discovery settings # The domain must be without protocol @@ -21,11 +27,25 @@ NOTESNOOK_SERVER_DOMAIN= IDENTITY_SERVER_DOMAIN= SSE_SERVER_DOMAIN= +# Add the origins on which you want to enable CORS. +# Leave it empty to allow all origins to access your server. +# Seperate each origin with a comma +# e.g. https://app.notesnook.com,http://localhost:3000 +NOTESNOOK_CORS_ORIGINS= # optional + # url of the web app instance you want to use -# e.g. http://localhost:3000 +# e.g. https://app.notesnook.com # Note: no slashes at the end NOTESNOOK_APP_HOST= # Minio is used for S3 storage MINIO_ROOT_USER= # aka. AccessKeyId (must be > 3 characters) MINIO_ROOT_PASSWORD= # aka. AccessKey (must be > 8 characters) + +# If you don't want to use Minio, you can use any other S3 compatible +# storage service. +S3_ACCESS_KEY= +S3_ACCESS_KEY_ID= +S3_SERVICE_URL= +S3_REGION= +S3_BUCKET_NAME=attachments # required \ No newline at end of file diff --git a/Notesnook.API/Dockerfile b/Notesnook.API/Dockerfile index 10b92db..2de048a 100644 --- a/Notesnook.API/Dockerfile +++ b/Notesnook.API/Dockerfile @@ -1,4 +1,4 @@ -FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build +FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build WORKDIR /app # restore all project dependencies @@ -22,7 +22,7 @@ ENV DOTNET_TC_QuickJitForLoops="1" DOTNET_ReadyToRun="0" DOTNET_TieredPGO="1" DO RUN dotnet publish -c Release -o /app/out --use-current-runtime --self-contained false --no-restore # final stage/image -FROM mcr.microsoft.com/dotnet/aspnet:7.0 +FROM mcr.microsoft.com/dotnet/aspnet:8.0 WORKDIR /app COPY --from=build /app/out . ENTRYPOINT ["dotnet", "Notesnook.API.dll"] \ No newline at end of file diff --git a/Notesnook.API/Notesnook.API.csproj b/Notesnook.API/Notesnook.API.csproj index 732a891..1888779 100644 --- a/Notesnook.API/Notesnook.API.csproj +++ b/Notesnook.API/Notesnook.API.csproj @@ -6,13 +6,13 @@ - + - + diff --git a/Streetwriters.Common/Constants.cs b/Streetwriters.Common/Constants.cs index 4a557c1..33adcbc 100644 --- a/Streetwriters.Common/Constants.cs +++ b/Streetwriters.Common/Constants.cs @@ -52,19 +52,19 @@ namespace Streetwriters.Common public static string TWILIO_AUTH_TOKEN => Environment.GetEnvironmentVariable("TWILIO_AUTH_TOKEN"); public static string TWILIO_SERVICE_SID => Environment.GetEnvironmentVariable("TWILIO_SERVICE_SID"); // Server discovery - public static int NOTESNOOK_SERVER_PORT => int.Parse(Environment.GetEnvironmentVariable("NOTESNOOK_SERVER_PORT")); + public static int NOTESNOOK_SERVER_PORT => int.Parse(Environment.GetEnvironmentVariable("NOTESNOOK_SERVER_PORT") ?? "80"); public static string NOTESNOOK_SERVER_HOST => Environment.GetEnvironmentVariable("NOTESNOOK_SERVER_HOST"); public static string NOTESNOOK_SERVER_DOMAIN => Environment.GetEnvironmentVariable("NOTESNOOK_SERVER_DOMAIN"); public static string NOTESNOOK_CERT_PATH => Environment.GetEnvironmentVariable("NOTESNOOK_CERT_PATH"); public static string NOTESNOOK_CERT_KEY_PATH => Environment.GetEnvironmentVariable("NOTESNOOK_CERT_KEY_PATH"); - public static int IDENTITY_SERVER_PORT => int.Parse(Environment.GetEnvironmentVariable("IDENTITY_SERVER_PORT")); + public static int IDENTITY_SERVER_PORT => int.Parse(Environment.GetEnvironmentVariable("IDENTITY_SERVER_PORT") ?? "80"); public static string IDENTITY_SERVER_HOST => Environment.GetEnvironmentVariable("IDENTITY_SERVER_HOST"); public static string IDENTITY_SERVER_DOMAIN => Environment.GetEnvironmentVariable("IDENTITY_SERVER_DOMAIN"); public static string IDENTITY_CERT_PATH => Environment.GetEnvironmentVariable("IDENTITY_CERT_PATH"); public static string IDENTITY_CERT_KEY_PATH => Environment.GetEnvironmentVariable("IDENTITY_CERT_KEY_PATH"); - public static int SSE_SERVER_PORT => int.Parse(Environment.GetEnvironmentVariable("SSE_SERVER_PORT")); + public static int SSE_SERVER_PORT => int.Parse(Environment.GetEnvironmentVariable("SSE_SERVER_PORT") ?? "80"); public static string SSE_SERVER_HOST => Environment.GetEnvironmentVariable("SSE_SERVER_HOST"); public static string SSE_SERVER_DOMAIN => Environment.GetEnvironmentVariable("SSE_SERVER_DOMAIN"); public static string SSE_CERT_PATH => Environment.GetEnvironmentVariable("SSE_CERT_PATH"); @@ -73,7 +73,7 @@ namespace Streetwriters.Common // internal public static string MONGODB_CONNECTION_STRING => Environment.GetEnvironmentVariable("MONGODB_CONNECTION_STRING"); public static string MONGODB_DATABASE_NAME => Environment.GetEnvironmentVariable("MONGODB_DATABASE_NAME"); - public static int SUBSCRIPTIONS_SERVER_PORT => int.Parse(Environment.GetEnvironmentVariable("SUBSCRIPTIONS_SERVER_PORT")); + public static int SUBSCRIPTIONS_SERVER_PORT => int.Parse(Environment.GetEnvironmentVariable("SUBSCRIPTIONS_SERVER_PORT") ?? "80"); public static string SUBSCRIPTIONS_SERVER_HOST => Environment.GetEnvironmentVariable("SUBSCRIPTIONS_SERVER_HOST"); public static string SUBSCRIPTIONS_SERVER_DOMAIN => Environment.GetEnvironmentVariable("SUBSCRIPTIONS_SERVER_DOMAIN"); public static string SUBSCRIPTIONS_CERT_PATH => Environment.GetEnvironmentVariable("SUBSCRIPTIONS_CERT_PATH"); diff --git a/Streetwriters.Identity/Dockerfile b/Streetwriters.Identity/Dockerfile index 5c8cf31..93d5195 100644 --- a/Streetwriters.Identity/Dockerfile +++ b/Streetwriters.Identity/Dockerfile @@ -1,4 +1,4 @@ -FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build +FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build WORKDIR /app # restore all project dependencies @@ -22,7 +22,7 @@ ENV DOTNET_TC_QuickJitForLoops="1" DOTNET_ReadyToRun="0" DOTNET_TieredPGO="1" DO RUN dotnet publish -c Release -o /app/out --use-current-runtime --self-contained false --no-restore # final stage/image -FROM mcr.microsoft.com/dotnet/aspnet:7.0 +FROM mcr.microsoft.com/dotnet/aspnet:8.0 WORKDIR /app COPY --from=build /app/out . ENTRYPOINT ["dotnet", "Streetwriters.Identity.dll"] \ No newline at end of file diff --git a/Streetwriters.Messenger/Dockerfile b/Streetwriters.Messenger/Dockerfile index 8f76128..f1ef195 100644 --- a/Streetwriters.Messenger/Dockerfile +++ b/Streetwriters.Messenger/Dockerfile @@ -1,4 +1,4 @@ -FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build +FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build WORKDIR /app # restore all project dependencies @@ -22,7 +22,7 @@ ENV DOTNET_TC_QuickJitForLoops="1" DOTNET_ReadyToRun="0" DOTNET_TieredPGO="1" DO RUN dotnet publish -c Release -o /app/out --use-current-runtime --self-contained false --no-restore # final stage/image -FROM mcr.microsoft.com/dotnet/aspnet:7.0 +FROM mcr.microsoft.com/dotnet/aspnet:8.0 WORKDIR /app COPY --from=build /app/out . ENTRYPOINT ["dotnet", "Streetwriters.Messenger.dll"] \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 5eaf89b..cef6cd4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,6 @@ version: "3.4" -x-server-discovery: - &server-discovery +x-server-discovery: &server-discovery NOTESNOOK_SERVER_PORT: 80 NOTESNOOK_SERVER_HOST: notesnook-server IDENTITY_SERVER_PORT: 80 @@ -10,13 +9,12 @@ x-server-discovery: SSE_SERVER_HOST: sse-server SELF_HOSTED: 1 -x-env-files: - &env-files +x-env-files: &env-files - .env services: notesnook-db: - image: mongo + image: mongo:7.0.12 networks: - notesnook command: --replSet rs0 --bind_ip_all @@ -27,7 +25,7 @@ services: # upgrading it to a replica set. This is only required once but we running # it multiple times is no issue. initiate-rs0: - image: mongo + image: mongo:7.0.12 networks: - notesnook depends_on: @@ -42,7 +40,7 @@ services: EOF notesnook-s3: - image: minio/minio + image: minio/minio:RELEASE.2024-07-29T22-14-52Z ports: - 9000:9000 - 9090:9090 @@ -52,14 +50,13 @@ services: - ${HOME}/.notesnook/s3:/data/s3 environment: MINIO_BROWSER: "on" - env_file: - - ./.env.local + env_file: *env-files command: server /data/s3 --console-address :9090 # There's no way to specify a default bucket in Minio so we have to # set it up ourselves. setup-s3: - image: minio/mc + image: minio/mc:RELEASE.2024-07-26T13-08-44Z depends_on: - notesnook-s3 networks: @@ -69,10 +66,10 @@ services: command: - -c - | - until mc config host add minio http://notesnook-s3:9000 $$MINIO_ROOT_USER $$MINIO_ROOT_PASSWORD; do + until mc alias set minio http://notesnook-s3:9000 ${MINIO_ROOT_USER:-minioadmin} ${MINIO_ROOT_PASSWORD:-minioadmin}; do sleep 1; done; - mc mb minio/nn-attachments -p + mc mb minio/$$S3_BUCKET_NAME -p identity-server: build: @@ -85,6 +82,12 @@ services: env_file: *env-files depends_on: - notesnook-db + healthcheck: + test: curl --fail http://localhost:8264/health || exit 1 + interval: 40s + timeout: 30s + retries: 3 + start_period: 60s environment: <<: *server-discovery MONGODB_CONNECTION_STRING: mongodb://notesnook-db:27017/identity?replSet=rs0 @@ -103,15 +106,22 @@ services: - notesnook-s3 - setup-s3 - identity-server + healthcheck: + test: curl --fail http://localhost:5264/health || exit 1 + interval: 40s + timeout: 30s + retries: 3 + start_period: 60s environment: <<: *server-discovery MONGODB_CONNECTION_STRING: mongodb://notesnook-db:27017/notesnook?replSet=rs0 MONGODB_DATABASE_NAME: notesnook - S3_INTERNAL_SERVICE_URL: http://notesnook-s3:9000 - S3_ACCESS_KEY_ID: "${MINIO_ROOT_USER:-minioadmin}" - S3_ACCESS_KEY: "${MINIO_ROOT_PASSWORD:-minioadmin}" - S3_SERVICE_URL: http://localhost:9000 - S3_REGION: us-east-1 + S3_INTERNAL_SERVICE_URL: "${S3_SERVICE_URL:-http://notesnook-s3:9000}" + S3_ACCESS_KEY_ID: "${S3_ACCESS_KEY_ID:-${MINIO_ROOT_USER:-minioadmin}}" + S3_ACCESS_KEY: "${S3_ACCESS_KEY:-${MINIO_ROOT_PASSWORD:-minioadmin}}" + S3_SERVICE_URL: "${S3_SERVICE_URL:-http://localhost:9000}" + S3_REGION: "${S3_REGION:-us-east-1}" + S3_BUCKET_NAME: "${S3_BUCKET_NAME}" sse-server: build: @@ -125,8 +135,24 @@ services: - notesnook-server networks: - notesnook + healthcheck: + test: curl --fail http://localhost:7264/health || exit 1 + interval: 40s + timeout: 30s + retries: 3 + start_period: 60s environment: <<: *server-discovery + autoheal: + image: willfarrell/autoheal:latest + tty: true + restart: always + environment: + - AUTOHEAL_INTERVAL=60 + - AUTOHEAL_START_PERIOD=300 + - AUTOHEAL_DEFAULT_STOP_TIMEOUT=10 + volumes: + - /var/run/docker.sock:/var/run/docker.sock networks: notesnook: