Add Postiz configuration and environment variables

- Updated .env.example to include new environment variables for Postiz, including authentication and social media integration settings.
- Modified Caddyfile to implement basic authentication for the Postiz service.
- Enhanced docker-compose.yml to incorporate Postiz environment variables and ensure proper service configuration.
- Updated scripts to generate Postiz-related secrets and included them in the final report for user reference.
This commit is contained in:
Yury Kossakovsky
2025-08-19 14:25:07 -06:00
parent 155c0243c5
commit f9b22d9631
5 changed files with 139 additions and 24 deletions

View File

@@ -322,3 +322,63 @@ PROMETHEUS_PASSWORD_HASH=
SEARXNG_PASSWORD_HASH=
COMFYUI_PASSWORD_HASH=
RAGAPP_PASSWORD_HASH=
############
# Postiz configuration
# Reference: https://docs.postiz.com/configuration/reference
# To protect Postiz via Caddy basic auth (optional), set these:
############
POSTIZ_USERNAME=
POSTIZ_PASSWORD=
POSTIZ_PASSWORD_HASH=
############
# Postiz Social Media Integrations
# Leave blank if not used. Provide credentials from each platform.
############
X_API_KEY=
X_API_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=
THREADS_APP_SECRET=
FACEBOOK_APP_ID=
FACEBOOK_APP_SECRET=
YOUTUBE_CLIENT_ID=
YOUTUBE_CLIENT_SECRET=
TIKTOK_CLIENT_ID=
TIKTOK_CLIENT_SECRET=
PINTEREST_CLIENT_ID=
PINTEREST_CLIENT_SECRET=
DRIBBBLE_CLIENT_ID=
DRIBBBLE_CLIENT_SECRET=
DISCORD_CLIENT_ID=
DISCORD_CLIENT_SECRET=
DISCORD_BOT_TOKEN_ID=
SLACK_ID=
SLACK_SECRET=
SLACK_SIGNING_SECRET=
MASTODON_URL=https://mastodon.social
MASTODON_CLIENT_ID=
MASTODON_CLIENT_SECRET=

View File

@@ -68,6 +68,9 @@
# Postiz
{$POSTIZ_HOSTNAME} {
basic_auth {
{$POSTIZ_USERNAME} {$POSTIZ_PASSWORD_HASH}
}
reverse_proxy postiz:5000
}

View File

@@ -201,32 +201,34 @@ services:
- caddy-data:/data:rw
- caddy-config:/config:rw
environment:
- N8N_HOSTNAME=${N8N_HOSTNAME}
- WEBUI_HOSTNAME=${WEBUI_HOSTNAME}
- FLOWISE_HOSTNAME=${FLOWISE_HOSTNAME}
- COMFYUI_HOSTNAME=${COMFYUI_HOSTNAME}
- COMFYUI_PASSWORD_HASH=${COMFYUI_PASSWORD_HASH}
- COMFYUI_USERNAME=${COMFYUI_USERNAME}
- DIFY_HOSTNAME=${DIFY_HOSTNAME}
- RAGAPP_HOSTNAME=${RAGAPP_HOSTNAME}
- RAGAPP_USERNAME=${RAGAPP_USERNAME}
- RAGAPP_PASSWORD_HASH=${RAGAPP_PASSWORD_HASH}
- SUPABASE_HOSTNAME=${SUPABASE_HOSTNAME}
- SEARXNG_HOSTNAME=${SEARXNG_HOSTNAME}
- LANGFUSE_HOSTNAME=${LANGFUSE_HOSTNAME}
- WEAVIATE_HOSTNAME=${WEAVIATE_HOSTNAME}
- QDRANT_HOSTNAME=${QDRANT_HOSTNAME}
- NEO4J_HOSTNAME=${NEO4J_HOSTNAME}
- LETSENCRYPT_EMAIL=${LETSENCRYPT_EMAIL:-internal}
- PROMETHEUS_HOSTNAME=${PROMETHEUS_HOSTNAME}
- FLOWISE_HOSTNAME=${FLOWISE_HOSTNAME}
- GRAFANA_HOSTNAME=${GRAFANA_HOSTNAME}
- LANGFUSE_HOSTNAME=${LANGFUSE_HOSTNAME}
- LETSENCRYPT_EMAIL=${LETSENCRYPT_EMAIL:-internal}
- LETTA_HOSTNAME=${LETTA_HOSTNAME}
- PROMETHEUS_USERNAME=${PROMETHEUS_USERNAME}
- PROMETHEUS_PASSWORD_HASH=${PROMETHEUS_PASSWORD_HASH}
- SEARXNG_USERNAME=${SEARXNG_USERNAME}
- SEARXNG_PASSWORD_HASH=${SEARXNG_PASSWORD_HASH}
- N8N_HOSTNAME=${N8N_HOSTNAME}
- NEO4J_HOSTNAME=${NEO4J_HOSTNAME}
- PORTAINER_HOSTNAME=${PORTAINER_HOSTNAME}
- POSTIZ_HOSTNAME=${POSTIZ_HOSTNAME}
- COMFYUI_HOSTNAME=${COMFYUI_HOSTNAME}
- COMFYUI_USERNAME=${COMFYUI_USERNAME}
- COMFYUI_PASSWORD_HASH=${COMFYUI_PASSWORD_HASH}
- POSTIZ_PASSWORD_HASH=${POSTIZ_PASSWORD_HASH}
- POSTIZ_USERNAME=${POSTIZ_USERNAME}
- PROMETHEUS_HOSTNAME=${PROMETHEUS_HOSTNAME}
- PROMETHEUS_PASSWORD_HASH=${PROMETHEUS_PASSWORD_HASH}
- PROMETHEUS_USERNAME=${PROMETHEUS_USERNAME}
- QDRANT_HOSTNAME=${QDRANT_HOSTNAME}
- RAGAPP_HOSTNAME=${RAGAPP_HOSTNAME}
- RAGAPP_PASSWORD_HASH=${RAGAPP_PASSWORD_HASH}
- RAGAPP_USERNAME=${RAGAPP_USERNAME}
- SEARXNG_HOSTNAME=${SEARXNG_HOSTNAME}
- SEARXNG_PASSWORD_HASH=${SEARXNG_PASSWORD_HASH}
- SEARXNG_USERNAME=${SEARXNG_USERNAME}
- SUPABASE_HOSTNAME=${SUPABASE_HOSTNAME}
- WEAVIATE_HOSTNAME=${WEAVIATE_HOSTNAME}
- WEBUI_HOSTNAME=${WEBUI_HOSTNAME}
cap_drop:
- ALL
cap_add:
@@ -613,6 +615,39 @@ services:
- DATABASE_URL=postgresql://postgres:${POSTGRES_PASSWORD}@postgres:5432/postgres?schema=postiz
- REDIS_URL=redis://redis:6379
- JWT_SECRET=${JWT_SECRET}
- DISABLE_REGISTRATION=true
# Social Media API Settings
- X_API_KEY=${X_API_KEY}
- X_API_SECRET=${X_API_SECRET}
- LINKEDIN_CLIENT_ID=${LINKEDIN_CLIENT_ID}
- LINKEDIN_CLIENT_SECRET=${LINKEDIN_CLIENT_SECRET}
- REDDIT_CLIENT_ID=${REDDIT_CLIENT_ID}
- REDDIT_CLIENT_SECRET=${REDDIT_CLIENT_SECRET}
- GITHUB_CLIENT_ID=${GITHUB_CLIENT_ID}
- GITHUB_CLIENT_SECRET=${GITHUB_CLIENT_SECRET}
- BEEHIIVE_API_KEY=${BEEHIIVE_API_KEY}
- BEEHIIVE_PUBLICATION_ID=${BEEHIIVE_PUBLICATION_ID}
- THREADS_APP_ID=${THREADS_APP_ID}
- THREADS_APP_SECRET=${THREADS_APP_SECRET}
- FACEBOOK_APP_ID=${FACEBOOK_APP_ID}
- FACEBOOK_APP_SECRET=${FACEBOOK_APP_SECRET}
- YOUTUBE_CLIENT_ID=${YOUTUBE_CLIENT_ID}
- YOUTUBE_CLIENT_SECRET=${YOUTUBE_CLIENT_SECRET}
- TIKTOK_CLIENT_ID=${TIKTOK_CLIENT_ID}
- TIKTOK_CLIENT_SECRET=${TIKTOK_CLIENT_SECRET}
- PINTEREST_CLIENT_ID=${PINTEREST_CLIENT_ID}
- PINTEREST_CLIENT_SECRET=${PINTEREST_CLIENT_SECRET}
- DRIBBBLE_CLIENT_ID=${DRIBBBLE_CLIENT_ID}
- DRIBBBLE_CLIENT_SECRET=${DRIBBBLE_CLIENT_SECRET}
- DISCORD_CLIENT_ID=${DISCORD_CLIENT_ID}
- DISCORD_CLIENT_SECRET=${DISCORD_CLIENT_SECRET}
- DISCORD_BOT_TOKEN_ID=${DISCORD_BOT_TOKEN_ID}
- SLACK_ID=${SLACK_ID}
- SLACK_SECRET=${SLACK_SECRET}
- SLACK_SIGNING_SECRET=${SLACK_SIGNING_SECRET}
- MASTODON_URL=${MASTODON_URL}
- MASTODON_CLIENT_ID=${MASTODON_CLIENT_ID}
- MASTODON_CLIENT_SECRET=${MASTODON_CLIENT_SECRET}
depends_on:
postgres:
condition: service_healthy

View File

@@ -53,6 +53,7 @@ declare -A VARS_TO_GENERATE=(
["DIFY_SECRET_KEY"]="secret:64" # Dify application secret key (maps to SECRET_KEY in Dify)
["COMFYUI_PASSWORD"]="password:32" # Added ComfyUI basic auth password
["RAGAPP_PASSWORD"]="password:32" # Added RAGApp basic auth password
["POSTIZ_PASSWORD"]="password:32" # Added Postiz basic auth password
)
# Initialize existing_env_vars and attempt to read .env if it exists
@@ -372,6 +373,7 @@ generated_values["N8N_WORKER_COUNT"]="$N8N_WORKER_COUNT"
generated_values["WEAVIATE_USERNAME"]="$USER_EMAIL" # Set Weaviate username for Caddy
generated_values["COMFYUI_USERNAME"]="$USER_EMAIL" # Set ComfyUI username for Caddy
generated_values["RAGAPP_USERNAME"]="$USER_EMAIL" # Set RAGApp username for Caddy
generated_values["POSTIZ_USERNAME"]="$USER_EMAIL" # Set Postiz username for Caddy
if [[ -n "$OPENAI_API_KEY" ]]; then
generated_values["OPENAI_API_KEY"]="$OPENAI_API_KEY"
@@ -397,6 +399,7 @@ found_vars["WEAVIATE_USERNAME"]=0
found_vars["NEO4J_AUTH_USERNAME"]=0
found_vars["COMFYUI_USERNAME"]=0
found_vars["RAGAPP_USERNAME"]=0
found_vars["POSTIZ_USERNAME"]=0
# Read template, substitute domain, generate initial values
while IFS= read -r line || [[ -n "$line" ]]; do
@@ -443,7 +446,7 @@ while IFS= read -r line || [[ -n "$line" ]]; do
# This 'else' block is for lines from template not covered by existing values or VARS_TO_GENERATE.
# Check if it is one of the user input vars - these are handled by found_vars later if not in template.
is_user_input_var=0 # Reset for each line
user_input_vars=("FLOWISE_USERNAME" "DASHBOARD_USERNAME" "LETSENCRYPT_EMAIL" "RUN_N8N_IMPORT" "PROMETHEUS_USERNAME" "SEARXNG_USERNAME" "OPENAI_API_KEY" "LANGFUSE_INIT_USER_EMAIL" "N8N_WORKER_COUNT" "WEAVIATE_USERNAME" "NEO4J_AUTH_USERNAME" "COMFYUI_USERNAME" "RAGAPP_USERNAME")
user_input_vars=("FLOWISE_USERNAME" "DASHBOARD_USERNAME" "LETSENCRYPT_EMAIL" "RUN_N8N_IMPORT" "PROMETHEUS_USERNAME" "SEARXNG_USERNAME" "OPENAI_API_KEY" "LANGFUSE_INIT_USER_EMAIL" "N8N_WORKER_COUNT" "WEAVIATE_USERNAME" "NEO4J_AUTH_USERNAME" "COMFYUI_USERNAME" "RAGAPP_USERNAME" "POSTIZ_USERNAME")
for uivar in "${user_input_vars[@]}"; do
if [[ "$varName" == "$uivar" ]]; then
is_user_input_var=1
@@ -525,7 +528,7 @@ if [[ -z "${generated_values[SERVICE_ROLE_KEY]}" ]]; then
fi
# Add any custom variables that weren't found in the template
for var in "FLOWISE_USERNAME" "DASHBOARD_USERNAME" "LETSENCRYPT_EMAIL" "RUN_N8N_IMPORT" "OPENAI_API_KEY" "PROMETHEUS_USERNAME" "SEARXNG_USERNAME" "LANGFUSE_INIT_USER_EMAIL" "N8N_WORKER_COUNT" "WEAVIATE_USERNAME" "NEO4J_AUTH_USERNAME" "COMFYUI_USERNAME" "RAGAPP_USERNAME"; do
for var in "FLOWISE_USERNAME" "DASHBOARD_USERNAME" "LETSENCRYPT_EMAIL" "RUN_N8N_IMPORT" "OPENAI_API_KEY" "PROMETHEUS_USERNAME" "SEARXNG_USERNAME" "LANGFUSE_INIT_USER_EMAIL" "N8N_WORKER_COUNT" "WEAVIATE_USERNAME" "NEO4J_AUTH_USERNAME" "COMFYUI_USERNAME" "RAGAPP_USERNAME" "POSTIZ_USERNAME"; do
if [[ ${found_vars["$var"]} -eq 0 && -v generated_values["$var"] ]]; then
# Before appending, check if it's already in TMP_ENV_FILE to avoid duplicates
if ! grep -q -E "^${var}=" "$TMP_ENV_FILE"; then
@@ -661,6 +664,18 @@ fi
_update_or_add_env_var "RAGAPP_PASSWORD_HASH" "$FINAL_RAGAPP_HASH"
# --- POSTIZ ---
POSTIZ_PLAIN_PASS="${generated_values["POSTIZ_PASSWORD"]}"
FINAL_POSTIZ_HASH="${generated_values[POSTIZ_PASSWORD_HASH]}"
if [[ -z "$FINAL_POSTIZ_HASH" && -n "$POSTIZ_PLAIN_PASS" ]]; then
NEW_HASH=$(_generate_and_get_hash "$POSTIZ_PLAIN_PASS")
if [[ -n "$NEW_HASH" ]]; then
FINAL_POSTIZ_HASH="$NEW_HASH"
generated_values["POSTIZ_PASSWORD_HASH"]="$NEW_HASH"
fi
fi
_update_or_add_env_var "POSTIZ_PASSWORD_HASH" "$FINAL_POSTIZ_HASH"
if [ $? -eq 0 ]; then # This $? reflects the status of the last mv command from the last _update_or_add_env_var call.
# For now, assuming if we reached here and mv was fine, primary operations were okay.
echo ".env file generated successfully in the project root ($OUTPUT_FILE)."

View File

@@ -140,7 +140,9 @@ if is_profile_active "postiz"; then
echo "================================= Postiz =============================="
echo
echo "Host: ${POSTIZ_HOSTNAME:-<hostname_not_set>}"
echo "Note: Configure Postgres/Redis in /config/.env inside the container on first run."
echo "Internal Access (from other containers): http://postiz:5000"
echo "User: ${POSTIZ_USERNAME:-<not_set_in_env>}"
echo "Password: ${POSTIZ_PASSWORD:-<not_set_in_env>}"
fi
if is_profile_active "ragapp"; then