From 75648cd90bd8748e0a091b6bf52942d91c159c96 Mon Sep 17 00:00:00 2001 From: jamesread Date: Fri, 13 Sep 2024 00:32:25 +0100 Subject: [PATCH 1/5] docs: extra comments in config, and how to make resend optional --- apps/docs/installation/development.mdx | 36 +++++++++++++++++++------- apps/docs/installation/docker.mdx | 2 +- 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/apps/docs/installation/development.mdx b/apps/docs/installation/development.mdx index c6e5f932..c456c5d2 100644 --- a/apps/docs/installation/development.mdx +++ b/apps/docs/installation/development.mdx @@ -17,10 +17,13 @@ This guide will ask you to install & configure several services exaplained below ### Prerequisite Cloud Services -- **[Resend account](https://resend.com)** - for user activation and email notifications. -- **[Cloudflare R2](https://cloudfalre.com)** - for uploads (optional, can use local machine), and storing account data. +- **[Cloudflare R2](https://cloudfalre.com)** - for uploads (optional, can use local machine). - **Social Media API details** - various API keys and secrets (more details later) for services you want to use; reddit, X, Instagram, etc.. +### Optional Cloud Services + +- **[Resend account](https://resend.com)** - for user activation and email notifications. + ### Prerequisite Local Services - **Node.js** - for running the code! (version 18+) @@ -78,6 +81,26 @@ FRONTEND_URL="http://localhost:4200" NEXT_PUBLIC_BACKEND_URL="http://localhost:3000" BACKEND_INTERNAL_URL="http://localhost:3000" +# Optional. Your upload directory path if you host your files locally. +UPLOAD_DIRECTORY="/opt/postiz/uploads/" + +# Optional: your upload directory slug if you host your files locally. +NEXT_PUBLIC_UPLOAD_STATIC_DIRECTORY="" + +## This is a dummy key, you must create your own from Resend. +## If this variable exists, user activation is required. +## If it is commented out, users are activated automatically. +#RESEND_API_KEY="RzeTwHijvxvPUerScFcenUZUALuQJzSaGSMJ" + +## These are dummy values, you must create your own from Cloudflare. +## Remember to set your public internet IP address in the allow-list for the API token. +CLOUDFLARE_ACCOUNT_ID="QhcMSXQyPuMCRpSQcSYdEuTYgHeCXHbu" +CLOUDFLARE_ACCESS_KEY="dcfCMSuFEeCNfvByUureMZEfxWJmDqZe" +CLOUDFLARE_SECRET_ACCESS_KEY="zTTMXBmtyLPwHEdpACGHgDgzRTNpTJewiNriLnUS" +CLOUDFLARE_BUCKETNAME="postiz" +CLOUDFLARE_BUCKET_URL="https://QhcMSXQyPuMCRpSQcSYdEuTYgHeCXHbu.r2.cloudflarestorage.com/" +CLOUDFLARE_REGION="auto" + # Social Media API Settings X_API_KEY="Twitter API key for normal oAuth not oAuth2" X_API_SECRET="Twitter API secret for normal oAuth not oAuth2" @@ -87,14 +110,7 @@ REDDIT_CLIENT_ID="Reddit Client ID" REDDIT_CLIENT_SECRET="Linkedin Client Secret" GITHUB_CLIENT_ID="GitHub Client ID" GITHUB_CLIENT_SECRET="GitHub Client Secret" -RESEND_API_KEY="Resend API KEY" -UPLOAD_DIRECTORY="optional: your upload directory path if you host your files locally" -NEXT_PUBLIC_UPLOAD_STATIC_DIRECTORY="optional: your upload directory slug if you host your files locally" -CLOUDFLARE_ACCOUNT_ID="Cloudflare R2 Account ID" -CLOUDFLARE_ACCESS_KEY="Cloudflare R2 Access Key" -CLOUDFLARE_SECRET_ACCESS_KEY="Cloudflare R2 Secret Access Key" -CLOUDFLARE_BUCKETNAME="Cloudflare R2 Bucket Name" -CLOUDFLARE_BUCKET_URL="Cloudflare R2 Backet URL" + # Developer Settings NX_ADD_PLUGINS=false diff --git a/apps/docs/installation/docker.mdx b/apps/docs/installation/docker.mdx index 487bf23c..2c9484ac 100644 --- a/apps/docs/installation/docker.mdx +++ b/apps/docs/installation/docker.mdx @@ -14,7 +14,7 @@ import DockerEnvvarApps from '/snippets/docker-envvar-apps.mdx'; # Create the container on command line ```bash -docker create --name postiz -v ./config:/config -p 4200:4200 -p 3000:3000 ghcr.io/postiz/postiz:latest +docker create --name postiz -v ./config:/config -p 4200:4200 -p 3000:3000 ghcr.io/postiz/postiz-app:latest ``` From a4991b2b10afcf0e2f0d560d5feee16892642178 Mon Sep 17 00:00:00 2001 From: jamesread Date: Fri, 13 Sep 2024 08:17:21 +0100 Subject: [PATCH 2/5] doc: Typo in cloudflare [skip ci] --- apps/docs/installation/development.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/docs/installation/development.mdx b/apps/docs/installation/development.mdx index c456c5d2..a5b2dc62 100644 --- a/apps/docs/installation/development.mdx +++ b/apps/docs/installation/development.mdx @@ -17,7 +17,7 @@ This guide will ask you to install & configure several services exaplained below ### Prerequisite Cloud Services -- **[Cloudflare R2](https://cloudfalre.com)** - for uploads (optional, can use local machine). +- **[Cloudflare R2](https://cloudflare.com)** - for uploads (optional, can use local machine). - **Social Media API details** - various API keys and secrets (more details later) for services you want to use; reddit, X, Instagram, etc.. ### Optional Cloud Services From 6224634dcb125d08651d8b5217c3881b90a9323d Mon Sep 17 00:00:00 2001 From: jamesread Date: Fri, 13 Sep 2024 08:49:58 +0100 Subject: [PATCH 3/5] feat: Migrations inside containers, and better default .env file. --- .env.example | 90 ++++++++++++++--------- apps/docs/installation/docker-compose.mdx | 2 - apps/docs/installation/docker.mdx | 13 +++- apps/docs/snippets/docker-database.mdx | 6 -- var/docker/entrypoint.sh | 3 + 5 files changed, 67 insertions(+), 47 deletions(-) delete mode 100644 apps/docs/snippets/docker-database.mdx diff --git a/.env.example b/.env.example index d06208b6..7528cf44 100644 --- a/.env.example +++ b/.env.example @@ -1,38 +1,44 @@ -DATABASE_URL="" -REDIS_URL="" -UPLOAD_DIRECTORY="" -NEXT_PUBLIC_UPLOAD_STATIC_DIRECTORY="" -STRIPE_PUBLISHABLE_KEY="" -STRIPE_SECRET_KEY="" -STRIPE_SIGNING_KEY="" -JWT_SECRET="" -FRONTEND_URL="" -MAIN_URL="" -NEXT_PUBLIC_BACKEND_URL="" -BACKEND_INTERNAL_URL="" -X_API_KEY="" -X_API_SECRET="" -X_CLIENT="" -X_SECRET="" -LINKEDIN_CLIENT_ID="" -LINKEDIN_CLIENT_SECRET="" -REDDIT_CLIENT_ID="" -REDDIT_CLIENT_SECRET="" -GITHUB_CLIENT_ID="" -GITHUB_CLIENT_SECRET="" -RESEND_API_KEY="" +# Required Settings +DATABASE_URL="postgresql://postiz-user:postiz-password@localhost:5432/postiz-db-local" +REDIS_URL="redis://localhost:6379" +JWT_SECRET="random string for your JWT secret, make it long" +FRONTEND_URL="http://localhost:4200" +NEXT_PUBLIC_BACKEND_URL="http://localhost:3000" +BACKEND_INTERNAL_URL="http://localhost:3000" + +# Optional. Your upload directory path if you host your files locally. +UPLOAD_DIRECTORY="/opt/postiz/uploads/" + +# Optional: your upload directory slug if you host your files locally. +NEXT_PUBLIC_UPLOAD_STATIC_DIRECTORY="/opt/postiz/uploads/" + +## This is a dummy key, you must create your own from Resend. +## If this variable exists, user activation is required. +## If it is commented out, users are activated automatically. +#RESEND_API_KEY="RzeTwHijvxvPUerScFcenUZUALuQJzSaGSMJ" +#EMAIL_FROM_ADDRESS="" +#EMAIL_FROM_NAME="" + +## These are dummy values, you must create your own from Cloudflare. +## Remember to set your public internet IP address in the allow-list for the API token. +CLOUDFLARE_ACCOUNT_ID="QhcMSXQyPuMCRpSQcSYdEuTYgHeCXHbu" +CLOUDFLARE_ACCESS_KEY="dcfCMSuFEeCNfvByUureMZEfxWJmDqZe" +CLOUDFLARE_SECRET_ACCESS_KEY="zTTMXBmtyLPwHEdpACGHgDgzRTNpTJewiNriLnUS" +CLOUDFLARE_BUCKETNAME="postiz" +CLOUDFLARE_BUCKET_URL="https://QhcMSXQyPuMCRpSQcSYdEuTYgHeCXHbu.r2.cloudflarestorage.com/" +CLOUDFLARE_REGION="auto" + +# Social Media API Settings +X_API_KEY="Twitter API key for normal oAuth not oAuth2" +X_API_SECRET="Twitter API secret for normal oAuth not oAuth2" +LINKEDIN_CLIENT_ID="Linkedin Client ID" +LINKEDIN_CLIENT_SECRET="Linkedin Client Secret" +REDDIT_CLIENT_ID="Reddit Client ID" +REDDIT_CLIENT_SECRET="Linkedin Client Secret" +GITHUB_CLIENT_ID="GitHub Client ID" +GITHUB_CLIENT_SECRET="GitHub Client Secret" BEEHIIVE_API_KEY="" BEEHIIVE_PUBLICATION_ID="" -NX_ADD_PLUGINS=false -CLOUDFLARE_ACCOUNT_ID="" -CLOUDFLARE_ACCESS_KEY="" -CLOUDFLARE_SECRET_ACCESS_KEY="" -CLOUDFLARE_BUCKETNAME="" -CLOUDFLARE_BUCKET_URL="" -CLOUDFLARE_REGION="" -FEE_AMOUNT=0.05 -OPENAI_API_KEY="" -NEXT_PUBLIC_DISCORD_SUPPORT="" THREADS_APP_ID="" THREADS_APP_SECRET="" FACEBOOK_APP_ID="" @@ -45,7 +51,19 @@ PINTEREST_CLIENT_ID="" PINTEREST_CLIENT_SECRET="" DRIBBBLE_CLIENT_ID="" DRIBBBLE_CLIENT_SECRET="" -IS_GENERAL="true" -EMAIL_FROM_ADDRESS="" -EMAIL_FROM_NAME="" + + +# Misc Settings +OPENAI_API_KEY="" +NEXT_PUBLIC_DISCORD_SUPPORT="" NEXT_PUBLIC_POLOTNO="Polotno key for the gallery" + +# Payment settings +FEE_AMOUNT=0.05 +STRIPE_PUBLISHABLE_KEY="" +STRIPE_SECRET_KEY="" +STRIPE_SIGNING_KEY="" + +# Developer Settings +NX_ADD_PLUGINS=false +IS_GENERAL="true" # required for now diff --git a/apps/docs/installation/docker-compose.mdx b/apps/docs/installation/docker-compose.mdx index 21b01799..d4e009b7 100644 --- a/apps/docs/installation/docker-compose.mdx +++ b/apps/docs/installation/docker-compose.mdx @@ -3,11 +3,9 @@ title: Docker Compose --- import EarlyDoc from '/snippets/earlydoc.mdx'; -import DockerDatabase from '/snippets/docker-database.mdx'; import DockerEnvvarApps from '/snippets/docker-envvar-apps.mdx'; - # Example `docker-compose.yml` file diff --git a/apps/docs/installation/docker.mdx b/apps/docs/installation/docker.mdx index 2c9484ac..154cdea6 100644 --- a/apps/docs/installation/docker.mdx +++ b/apps/docs/installation/docker.mdx @@ -3,18 +3,25 @@ title: Docker --- import EarlyDoc from '/snippets/earlydoc.mdx'; -import DockerDatabase from '/snippets/docker-database.mdx'; import DockerEnvvarApps from '/snippets/docker-envvar-apps.mdx'; - +# Set environment variables +Postiz configuration is entirely via environment variables for now. You might be used to setting environment variables when starting containers, +however postiz needs a LOT of environment variables, so setting these on command line or in a docker-compose is probably not practical for long +term maintainability. + +It is recommended to use a `.env` file, which the Postiz containers look for in /config. Docker will automatically create this file for you on a +docker volume the first time you start up Postiz. + +The default .env file can be found here; [example .env file](https://raw.githubusercontent.com/gitroomhq/postiz-app/main/.env.example) # Create the container on command line ```bash -docker create --name postiz -v ./config:/config -p 4200:4200 -p 3000:3000 ghcr.io/postiz/postiz-app:latest +docker create --name postiz -v ./config:/config -p 4200:4200 -p 3000:3000 ghcr.io/gitroomhq/postiz-app:latest ``` diff --git a/apps/docs/snippets/docker-database.mdx b/apps/docs/snippets/docker-database.mdx deleted file mode 100644 index babd2cf5..00000000 --- a/apps/docs/snippets/docker-database.mdx +++ /dev/null @@ -1,6 +0,0 @@ - -The container images do not yet provide automatic database "installation" -(migrations). This must be done manually outside of the docker containers for now. - -This is being worked on with a high priority. - diff --git a/var/docker/entrypoint.sh b/var/docker/entrypoint.sh index 2e98950e..f896d960 100755 --- a/var/docker/entrypoint.sh +++ b/var/docker/entrypoint.sh @@ -15,6 +15,9 @@ if [[ "$POSTIZ_APPS" -eq "" ]]; then POSTIZ_APPS="frontend workers cron backend" fi +echo "Running database migrations" +npm run prisma-db-push + mkdir -p /etc/supervisor.d/ if [[ "$POSTIZ_APPS" == *"frontend"* ]]; then From b735a7ce8e86b08be8f26bb9a10257a05e4a334b Mon Sep 17 00:00:00 2001 From: jamesread Date: Fri, 13 Sep 2024 09:00:38 +0100 Subject: [PATCH 4/5] doc: Cleanup a few default config keys --- .env.example | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/.env.example b/.env.example index 7528cf44..7ef00fa5 100644 --- a/.env.example +++ b/.env.example @@ -29,14 +29,16 @@ CLOUDFLARE_BUCKET_URL="https://QhcMSXQyPuMCRpSQcSYdEuTYgHeCXHbu.r2.cloudflaresto CLOUDFLARE_REGION="auto" # Social Media API Settings -X_API_KEY="Twitter API key for normal oAuth not oAuth2" -X_API_SECRET="Twitter API secret for normal oAuth not oAuth2" -LINKEDIN_CLIENT_ID="Linkedin Client ID" -LINKEDIN_CLIENT_SECRET="Linkedin Client Secret" -REDDIT_CLIENT_ID="Reddit Client ID" -REDDIT_CLIENT_SECRET="Linkedin Client Secret" -GITHUB_CLIENT_ID="GitHub Client ID" -GITHUB_CLIENT_SECRET="GitHub Client Secret" +X_API_KEY="" +X_API_SECRET="" +X_CLIENT="" +X_SECRET="" +LINKEDIN_CLIENT_ID="" +LINKEDIN_CLIENT_SECRET="" +REDDIT_CLIENT_ID="" +REDDIT_CLIENT_SECRET="" +GITHUB_CLIENT_ID="" +GITHUB_CLIENT_SECRET="" BEEHIIVE_API_KEY="" BEEHIIVE_PUBLICATION_ID="" THREADS_APP_ID="" @@ -52,7 +54,6 @@ PINTEREST_CLIENT_SECRET="" DRIBBBLE_CLIENT_ID="" DRIBBBLE_CLIENT_SECRET="" - # Misc Settings OPENAI_API_KEY="" NEXT_PUBLIC_DISCORD_SUPPORT="" @@ -63,6 +64,7 @@ FEE_AMOUNT=0.05 STRIPE_PUBLISHABLE_KEY="" STRIPE_SECRET_KEY="" STRIPE_SIGNING_KEY="" +STRIPE_SIGNING_KEY_CONNECT="" # Developer Settings NX_ADD_PLUGINS=false From 1498f04ba6f856099ac2f8dea73b626cf6bec883 Mon Sep 17 00:00:00 2001 From: jamesread Date: Fri, 13 Sep 2024 20:37:16 +0100 Subject: [PATCH 5/5] ci: Docker frontend startup, move packages to devcontainer, and config to postiz.env --- Dockerfile.dev | 24 +++++++++++++++--------- var/docker/entrypoint.sh | 2 +- var/docker/supervisord/frontend.conf | 4 ++-- 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/Dockerfile.dev b/Dockerfile.dev index fc85c023..d43b45af 100644 --- a/Dockerfile.dev +++ b/Dockerfile.dev @@ -15,14 +15,7 @@ ENV NEXT_TELEMETRY_DISABLED=1 RUN apk add --no-cache \ bash=5.2.21-r0 \ - supervisor=4.2.5-r4 \ - pkgconfig \ - gcc \ - pixman-dev \ - cairo-dev \ - pango-dev \ - make \ - build-base + supervisor=4.2.5-r4 WORKDIR /app @@ -32,7 +25,7 @@ EXPOSE 3000 COPY var/docker/entrypoint.sh /app/entrypoint.sh COPY var/docker/supervisord.conf /etc/supervisord.conf COPY var/docker/supervisord /app/supervisord_available_configs/ -COPY .env.example /config/.env +COPY .env.example /config/postiz.env VOLUME /config @@ -43,12 +36,23 @@ ENTRYPOINT ["/app/entrypoint.sh"] # Builder image FROM base AS devcontainer +RUN apk add --no-cache \ + pkgconfig \ + gcc \ + pixman-dev \ + cairo-dev \ + pango-dev \ + make \ + build-base + COPY nx.json tsconfig.base.json package.json package-lock.json /app/ COPY apps /app/apps/ COPY libraries /app/libraries/ RUN npm ci --no-fund && npx nx run-many --target=build --projects=frontend,backend,workers,cron +VOLUME /config + LABEL org.opencontainers.image.title="Postiz App (DevContainer)" # Output image @@ -59,5 +63,7 @@ COPY --from=devcontainer /app/dist/ /app/dist/ COPY package.json nx.json /app/ +VOLUME /config + ## Labels at the bottom, because CI will eventually add dates, commit hashes, etc. LABEL org.opencontainers.image.title="Postiz App (Production)" diff --git a/var/docker/entrypoint.sh b/var/docker/entrypoint.sh index f896d960..f79c8f42 100755 --- a/var/docker/entrypoint.sh +++ b/var/docker/entrypoint.sh @@ -7,7 +7,7 @@ if [[ "$SKIP_CONFIG_CHECK" != "true" ]]; then echo "ERROR: No .env file found in /config/.env" fi - ln -sf /config/.env /app/.env + ln -sf /config/postiz.env /app/.env fi if [[ "$POSTIZ_APPS" -eq "" ]]; then diff --git a/var/docker/supervisord/frontend.conf b/var/docker/supervisord/frontend.conf index c157a205..53c03a6f 100644 --- a/var/docker/supervisord/frontend.conf +++ b/var/docker/supervisord/frontend.conf @@ -1,6 +1,6 @@ [program:frontend] -directory=/app -command=npm run start:prod:frontend +directory=/app/dist/apps/frontend +command=npx next start autostart=true autorestart=false redirect_stderr=true