diff --git a/Dockerfile.dev b/Dockerfile.dev index 80d439dc..01ad14d6 100644 --- a/Dockerfile.dev +++ b/Dockerfile.dev @@ -1,11 +1,18 @@ -FROM node:22.20-alpine +FROM node:22.20-bookworm-slim ARG NEXT_PUBLIC_VERSION ENV NEXT_PUBLIC_VERSION=$NEXT_PUBLIC_VERSION -RUN apk add --no-cache g++ make py3-pip bash nginx -RUN adduser -D -g 'www' www -RUN mkdir /www -RUN chown -R www:www /var/lib/nginx -RUN chown -R www:www /www +RUN apt-get update && apt-get install -y --no-install-recommends \ + g++ \ + make \ + python3-pip \ + bash \ + nginx \ +&& rm -rf /var/lib/apt/lists/* + +RUN addgroup --system www \ + && adduser --system --ingroup www --home /www --shell /usr/sbin/nologin www \ + && mkdir -p /www \ + && chown -R www:www /www /var/lib/nginx RUN npm --no-update-notifier --no-fund --global install pnpm@10.6.1 pm2 diff --git a/docker-compose.dev.yaml b/docker-compose.dev.yaml index 38ee985b..91fb1c99 100644 --- a/docker-compose.dev.yaml +++ b/docker-compose.dev.yaml @@ -12,6 +12,7 @@ services: POSTGRES_PASSWORD: postiz-local-pwd POSTGRES_USER: postiz-local POSTGRES_DB: postiz-db-local + TEMPORAL_ADDRESS: "temporal:7233" volumes: - postgres-volume:/var/lib/postgresql/data ports: diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 00000000..7bf244d7 --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,268 @@ +services: + postiz: + image: ghcr.io/gitroomhq/postiz-app:latest + container_name: postiz + restart: always + environment: + # === Required Settings + MAIN_URL: 'http://localhost:4007' + FRONTEND_URL: 'http://localhost:4007' + NEXT_PUBLIC_BACKEND_URL: 'http://localhost:4007/api' + JWT_SECRET: 'random string that is unique to every install - just type random characters here!' + DATABASE_URL: 'postgresql://postiz-user:postiz-password@postiz-postgres:5432/postiz-db-local' + REDIS_URL: 'redis://postiz-redis:6379' + BACKEND_INTERNAL_URL: 'http://localhost:3000' + TEMPORAL_ADDRESS: "temporal:7233" + IS_GENERAL: 'true' + DISABLE_REGISTRATION: 'false' + + # === Storage Settings + STORAGE_PROVIDER: 'local' + UPLOAD_DIRECTORY: '/uploads' + NEXT_PUBLIC_UPLOAD_DIRECTORY: '/uploads' + + # === Cloudflare (R2) Settings + # STORAGE_PROVIDER: 'cloudflare' + # CLOUDFLARE_ACCOUNT_ID: 'your-account-id' + # CLOUDFLARE_ACCESS_KEY: 'your-access-key' + # CLOUDFLARE_SECRET_ACCESS_KEY: 'your-secret-access-key' + # CLOUDFLARE_BUCKETNAME: 'your-bucket-name' + # CLOUDFLARE_BUCKET_URL: 'https://your-bucket-url.r2.cloudflarestorage.com/' + # CLOUDFLARE_REGION: 'auto' + + # === Social Media API Settings + 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: '' + + # === OAuth & Authentik Settings + # NEXT_PUBLIC_POSTIZ_OAUTH_DISPLAY_NAME: 'Authentik' + # NEXT_PUBLIC_POSTIZ_OAUTH_LOGO_URL: 'https://raw.githubusercontent.com/walkxcode/dashboard-icons/master/png/authentik.png' + # POSTIZ_GENERIC_OAUTH: 'false' + # POSTIZ_OAUTH_URL: 'https://auth.example.com' + # POSTIZ_OAUTH_AUTH_URL: 'https://auth.example.com/application/o/authorize' + # POSTIZ_OAUTH_TOKEN_URL: 'https://auth.example.com/application/o/token' + # POSTIZ_OAUTH_USERINFO_URL: 'https://authentik.example.com/application/o/userinfo' + # POSTIZ_OAUTH_CLIENT_ID: '' + # POSTIZ_OAUTH_CLIENT_SECRET: '' + # POSTIZ_OAUTH_SCOPE: "openid profile email" # Optional: uncomment to override default scope + + # === Sentry + + # NEXT_PUBLIC_SENTRY_DSN: 'http://spotlight:8969/stream' + # SENTRY_SPOTLIGHT: '1' + + # === Misc Settings + OPENAI_API_KEY: '' + NEXT_PUBLIC_DISCORD_SUPPORT: '' + NEXT_PUBLIC_POLOTNO: '' + API_LIMIT: 30 + + # === Payment / Stripe Settings + FEE_AMOUNT: 0.05 + STRIPE_PUBLISHABLE_KEY: '' + STRIPE_SECRET_KEY: '' + STRIPE_SIGNING_KEY: '' + STRIPE_SIGNING_KEY_CONNECT: '' + + # === Developer Settings + NX_ADD_PLUGINS: false + + # === Short Link Service Settings (Optional - leave blank if unused) + # DUB_TOKEN: "" + # DUB_API_ENDPOINT: "https://api.dub.co" + # DUB_SHORT_LINK_DOMAIN: "dub.sh" + # SHORT_IO_SECRET_KEY: "" + # KUTT_API_KEY: "" + # KUTT_API_ENDPOINT: "https://kutt.it/api/v2" + # KUTT_SHORT_LINK_DOMAIN: "kutt.it" + # LINK_DRIP_API_KEY: "" + # LINK_DRIP_API_ENDPOINT: "https://api.linkdrip.com/v1/" + # LINK_DRIP_SHORT_LINK_DOMAIN: "dripl.ink" + + volumes: + - postiz-config:/config/ + - postiz-uploads:/uploads/ + ports: + - "4007:5000" + networks: + - postiz-network + - temporal-network + depends_on: + postiz-postgres: + condition: service_healthy + postiz-redis: + condition: service_healthy + + postiz-postgres: + image: postgres:17-alpine + container_name: postiz-postgres + restart: always + environment: + POSTGRES_PASSWORD: postiz-password + POSTGRES_USER: postiz-user + POSTGRES_DB: postiz-db-local + volumes: + - postgres-volume:/var/lib/postgresql/data + networks: + - postiz-network + healthcheck: + test: pg_isready -U postiz-user -d postiz-db-local + interval: 10s + timeout: 3s + retries: 3 + postiz-redis: + image: redis:7.2 + container_name: postiz-redis + restart: always + healthcheck: + test: redis-cli ping + interval: 10s + timeout: 3s + retries: 3 + volumes: + - postiz-redis-data:/data + networks: + - postiz-network + + # For Application Monitoring / Debugging + spotlight: + pull_policy: always + container_name: spotlight + ports: + - 8969:8969/tcp + image: ghcr.io/getsentry/spotlight:latest + networks: + - postiz-network + + # ----------------------- + # Temporal Stack + # ----------------------- + temporal-elasticsearch: + container_name: temporal-elasticsearch + image: elasticsearch:7.17.27 + environment: + - cluster.routing.allocation.disk.threshold_enabled=true + - cluster.routing.allocation.disk.watermark.low=512mb + - cluster.routing.allocation.disk.watermark.high=256mb + - cluster.routing.allocation.disk.watermark.flood_stage=128mb + - discovery.type=single-node + - ES_JAVA_OPTS=-Xms256m -Xmx256m + - xpack.security.enabled=false + networks: + - temporal-network + expose: + - 9200 + volumes: + - /var/lib/elasticsearch/data + + temporal-postgresql: + container_name: temporal-postgresql + image: postgres:16 + environment: + POSTGRES_PASSWORD: temporal + POSTGRES_USER: temporal + networks: + - temporal-network + expose: + - 5432 + volumes: + - /var/lib/postgresql/data + + temporal: + container_name: temporal + ports: + - '7233:7233' + image: temporalio/auto-setup:1.28.1 + depends_on: + - temporal-postgresql + - temporal-elasticsearch + environment: + - DB=postgres12 + - DB_PORT=5432 + - POSTGRES_USER=temporal + - POSTGRES_PWD=temporal + - POSTGRES_SEEDS=temporal-postgresql + - DYNAMIC_CONFIG_FILE_PATH=config/dynamicconfig/development-sql.yaml + - ENABLE_ES=true + - ES_SEEDS=temporal-elasticsearch + - ES_VERSION=v7 + - TEMPORAL_NAMESPACE=default + networks: + - temporal-network + volumes: + - ./dynamicconfig:/etc/temporal/config/dynamicconfig + labels: + kompose.volume.type: configMap + + temporal-admin-tools: + container_name: temporal-admin-tools + image: temporalio/admin-tools:1.28.1-tctl-1.18.4-cli-1.4.1 + environment: + - TEMPORAL_ADDRESS=temporal:7233 + - TEMPORAL_CLI_ADDRESS=temporal:7233 + networks: + - temporal-network + stdin_open: true + depends_on: + - temporal + tty: true + + temporal-ui: + container_name: temporal-ui + image: temporalio/ui:2.34.0 + environment: + - TEMPORAL_ADDRESS=temporal:7233 + - TEMPORAL_CORS_ORIGINS=http://127.0.0.1:3000 + networks: + - temporal-network + ports: + - '8080:8080' + +volumes: + postgres-volume: + external: false + + postiz-redis-data: + external: false + + postiz-config: + external: false + + postiz-uploads: + external: false + +networks: + postiz-network: + external: false + temporal-network: + driver: bridge + name: temporal-network diff --git a/package.json b/package.json index fad2eab8..5973b71f 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "dev:docker": "docker compose -f ./docker-compose.dev.yaml up -d", "commands:build:development": "pnpm --filter ./apps/commands run build", "prisma-generate": "pnpm dlx prisma@6.5.0 generate --schema ./libraries/nestjs-libraries/src/database/prisma/schema.prisma", - "prisma-db-push": "pnpm dlx prisma@6.5.0 db push --schema ./libraries/nestjs-libraries/src/database/prisma/schema.prisma", + "prisma-db-push": "pnpm dlx prisma@6.5.0 db push --accept-data-loss --schema ./libraries/nestjs-libraries/src/database/prisma/schema.prisma", "prisma-db-pull": "pnpm dlx prisma@6.5.0 db pull --schema ./libraries/nestjs-libraries/src/database/prisma/schema.prisma", "prisma-reset": "cd ./libraries/nestjs-libraries/src/database/prisma && pnpm dlx prisma@6.5.0 db push --force-reset && pnpx prisma@6.5.0 db push", "docker-build": "./var/docker/docker-build.sh",