From 0c16830c80346cd217aba03b23f6efeac366257f Mon Sep 17 00:00:00 2001 From: DrMxrcy <58747968+DrMxrcy@users.noreply.github.com> Date: Sun, 14 May 2023 19:04:29 -0400 Subject: [PATCH] Add Mixpost Pro (#517) * Add Mixpost Pro * Update Compose --- apps/mixpost-pro/config.json | 44 +++++++++++++++ apps/mixpost-pro/docker-compose.yml | 65 +++++++++++++++++++++++ apps/mixpost-pro/metadata/description.md | 29 ++++++++++ apps/mixpost-pro/metadata/logo.jpg | Bin 0 -> 17176 bytes 4 files changed, 138 insertions(+) create mode 100644 apps/mixpost-pro/config.json create mode 100644 apps/mixpost-pro/docker-compose.yml create mode 100644 apps/mixpost-pro/metadata/description.md create mode 100644 apps/mixpost-pro/metadata/logo.jpg diff --git a/apps/mixpost-pro/config.json b/apps/mixpost-pro/config.json new file mode 100644 index 00000000..fc88c6b6 --- /dev/null +++ b/apps/mixpost-pro/config.json @@ -0,0 +1,44 @@ +{ + "$schema": "../schema.json", + "name": "Mixpost Pro", + "port": 8191, + "available": true, + "exposable": true, + "id": "mixpost-pro", + "tipi_version": 1, + "version": "latest", + "categories": ["social"], + "description": "Mixpost it's the coolest Self-hosted social media management software.", + "short_desc": "Self-hosted social media management. Schedule and organize your social content. ", + "author": "Inovector", + "source": "https://github.com/inovector/mixpost", + "supported_architectures": ["amd64"], + "form_fields": [ + { + "type": "random", + "label": "Mixpost SQL Password", + "min": 32, + "env_variable": "MIXPOST_MYSQL_PASSWORD" + }, + { + "type": "random", + "label": "Mixpost Redis Password", + "min": 32, + "env_variable": "MIXPOST_REDIS_PASSWORD" + }, + { + "type": "random", + "label": "Application key", + "required": false, + "min": 32, + "max": 32, + "env_variable": "MIXPOST_APP_KEY" + }, + { + "type": "text", + "label": "Mixpost Pro License key", + "required": true, + "env_variable": "MIXPOST_LICENSE_KEY" + } + ] +} diff --git a/apps/mixpost-pro/docker-compose.yml b/apps/mixpost-pro/docker-compose.yml new file mode 100644 index 00000000..221ab1a2 --- /dev/null +++ b/apps/mixpost-pro/docker-compose.yml @@ -0,0 +1,65 @@ +version: '3.7' + +services: + mixpost-pro: + image: inovector/mixpost-pro-team:latest + container_name: mixpost-pro + environment: + - APP_NAME='Mixpost' + - MIXPOST_VERSION='^0.2' + - LICENSE_KEY=${MIXPOST_LICENSE_KEY} + - APP_KEY='${MIXPOST_APP_KEY}' + - APP_URL='${APP_PROTOCOL:-http}://${APP_DOMAIN}' + - DB_HOST=mixpost-mysql + - DB_DATABASE=mixpost + - DB_USERNAME=tipi + - DB_PASSWORD=${MIXPOST_MYSQL_PASSWORD} + - REDIS_HOST=mixpost-redis + - REDIS_PASSWORD=${MIXPOST_REDIS_PASSWORD} + restart: unless-stopped + volumes: + - ${APP_DATA_DIR}/data/mixpost-pro:/var/www/html/storage/app + ports: + - ${APP_PORT}:80 + depends_on: + - mixpost-pro-mysql + - mixpost-pro-redis + networks: + - tipi_main_network + labels: + traefik.enable: ${APP_EXPOSED} + traefik.http.routers.mixpost-pro.rule: Host(`${APP_DOMAIN}`) + traefik.http.routers.mixpost-pro.entrypoints: websecure + traefik.http.routers.mixpost-pro.service: mixpost-pro + traefik.http.routers.mixpost-pro.tls.certresolver: myresolver + traefik.http.services.mixpost-pro.loadbalancer.server.port: 80 + + mixpost-pro-mysql: + image: mysql/mysql-server:8.0 + container_name: mixpost_mysql + restart: unless-stopped + environment: + - MYSQL_ROOT_PASSWORD=${MIXPOST_MYSQL_PASSWORD} + - MYSQL_USER=tipi + - MYSQL_PASSWORD=${MIXPOST_MYSQL_PASSWORD} + - MYSQL_DATABASE=mixpost + healthcheck: + test: ['CMD', 'mysqladmin', 'ping', '-p ${MIXPOST_MYSQL_PASSWORD}'] + retries: 3 + timeout: 5s + volumes: + - ${APP_DATA_DIR}/data/mysql:/var/lib/mysql + networks: + - tipi_main_network + + mixpost-pro-redis: + image: 'redis:latest' + command: redis-server --appendonly yes --replica-read-only no --requirepass "${MIXPOST_REDIS_PASSWORD}" + volumes: + - '${APP_DATA_DIR}/data/redis:/data' + healthcheck: + test: ['CMD', 'redis-cli', 'ping'] + retries: 3 + timeout: 5s + networks: + - tipi_main_network diff --git a/apps/mixpost-pro/metadata/description.md b/apps/mixpost-pro/metadata/description.md new file mode 100644 index 00000000..8a5557bc --- /dev/null +++ b/apps/mixpost-pro/metadata/description.md @@ -0,0 +1,29 @@ +## Inital Setup + +An admin user will be created automatically. SSH into your Tipi server and run `docker logs mixpost 2>&1 | grep "Your password" ` to find out the password. + +You can log in to Mixpost at /mixpost using the admin user account created. + +Read the docs here https://docs.inovector.com/books/mixpost-pro-team + +## Inital User + +Username: admin@admin.com +Password: SSH into your Tipi server and run `docker logs mixpost 2>&1 | grep "Your password" ` + +## Introduction + +Mixpost it's the coolest Self-hosted social media management software. + +This package is the Lite version of Mixpost Pro, and by integrating it into your Laravel project, you can easily create, schedule, publish, and manage social media content in one place, with no limits or monthly subscription fees. + +It's the perfect social media management solution for bloggers, crafters and entrepreneurs. + +**Mixpost Pro is under development and will be released soon. Sign up to be notified when it's released [mixpost.app](https://mixpost.app/)** + +Join our community: + +- [Discord](https://discord.gg/5YdseZnK2Z) +- [Facebook Private Group](https://www.facebook.com/groups/inovector) + +[![](https://github.com/inovector/mixpost/raw/main/art/cover.png?v=3)](https://mixpost.app) diff --git a/apps/mixpost-pro/metadata/logo.jpg b/apps/mixpost-pro/metadata/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..99f94cb719b79fb80d581c783588dc14898216ba GIT binary patch literal 17176 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 nBb9@|P#F9V2&)};;lQVnnl2aLVhjkvd{W!M`Q@