From f953328ccfd38281ddb446728f0d5da5be536327 Mon Sep 17 00:00:00 2001 From: Mytraas <33683465+Mytraas@users.noreply.github.com> Date: Sun, 26 Nov 2023 17:36:19 +0100 Subject: [PATCH] Add WordPress (#1679) * Add WordPress * update docker-composer.yml and config.json according to runtipi-appstore requested changes * update docker-composer.yml and config.json according to runtipi-appstore requested changes * README.md updated with wordpress added in Apps available * refactor(wordpress): remove the db user var --------- Co-authored-by: Stavros --- README.md | 1 + apps/wordpress/config.json | 33 ++++++++++++++ apps/wordpress/docker-compose.yml | 59 +++++++++++++++++++++++++ apps/wordpress/metadata/description.md | 39 ++++++++++++++++ apps/wordpress/metadata/logo.jpg | Bin 0 -> 17906 bytes 5 files changed, 132 insertions(+) create mode 100644 apps/wordpress/config.json create mode 100644 apps/wordpress/docker-compose.yml create mode 100644 apps/wordpress/metadata/description.md create mode 100644 apps/wordpress/metadata/logo.jpg diff --git a/README.md b/README.md index 08837cdc..737fa425 100644 --- a/README.md +++ b/README.md @@ -164,6 +164,7 @@ This is the official repository for the Tipi App Store. It contains all the apps - [Wireguard Easy](https://github.com/WeeJeWel/wg-easy) - WireGuard VPN + Web-based Admin UI - [WikiJS](https://github.com/requarks/wiki) - A modern and powerful wiki app built on Node.js - [Wizarr](https://github.com/Wizarrrr/wizarr) - Wizarr is an advanced user invitation and management system for Jellyfin, Plex, Emby etc. +- [WordPress](https://github.com/WordPress/WordPress) - WordPress is a popular content management system for creating websites and blogs. - [Your Spotify](https://github.com/Yooooomi/your_spotify) - Self hosted Spotify tracking dashboard - [ZeroTier](https://github.com/zerotier/ZeroTierOne) - Easy to use zero configuration VPN. - [Zipline](https://github.com/diced/zipline) - A ShareX/file upload server that is easy to use, packed with features, and with an easy setup! diff --git a/apps/wordpress/config.json b/apps/wordpress/config.json new file mode 100644 index 00000000..966fafe6 --- /dev/null +++ b/apps/wordpress/config.json @@ -0,0 +1,33 @@ +{ + "name": "WordPress", + "available": true, + "port": 8213, + "exposable": true, + "id": "wordpress", + "description": "WordPress is a popular content management system for creating websites and blogs.", + "tipi_version": 1, + "version": "6.4.1", + "categories": ["social"], + "short_desc": "Popular CMS for websites and blogs", + "author": "WordPress.org", + "source": "https://github.com/WordPress/WordPress", + "website": "https://wordpress.org", + "form_fields": [ + { + "type": "random", + "label": "Database Password", + "min": 32, + "env_variable": "DB_PASSWORD" + }, + { + "type": "random", + "label": "Database Root Password", + "min": 32, + "env_variable": "DB_ROOT_PASSWORD" + } + ], + "supported_architectures": [ + "amd64", + "arm64" + ] +} \ No newline at end of file diff --git a/apps/wordpress/docker-compose.yml b/apps/wordpress/docker-compose.yml new file mode 100644 index 00000000..f91093dd --- /dev/null +++ b/apps/wordpress/docker-compose.yml @@ -0,0 +1,59 @@ +version: "3.9" +services: + + wordpress: + container_name: wordpress + image: wordpress:6.4.1 + environment: + - WORDPRESS_DB_HOST=wordpress-db + - WORDPRESS_DB_NAME=wordpress + - WORDPRESS_DB_USER=tipi + - WORDPRESS_DB_PASSWORD=${DB_PASSWORD} + volumes: + - ${APP_DATA_DIR}/data/wordpress:/var/www/html + ports: + - ${APP_PORT}:80 + restart: unless-stopped + depends_on: + - wordpress-db + networks: + - tipi_main_network + labels: + # Main + traefik.enable: true + traefik.http.middlewares.wordpress-web-redirect.redirectscheme.scheme: https + traefik.http.services.wordpress-web.loadbalancer.server.port: 80 + # Web + traefik.http.routers.wordpress-web-insecure.rule: Host(`${APP_DOMAIN}`) + traefik.http.routers.wordpress-web-insecure.entrypoints: web + traefik.http.routers.wordpress-web-insecure.service: wordpress-web + traefik.http.routers.wordpress-web-insecure.middlewares: wordpress-web-redirect + # Websecure + traefik.http.routers.wordpress-web.rule: Host(`${APP_DOMAIN}`) + traefik.http.routers.wordpress-web.entrypoints: websecure + traefik.http.routers.wordpress-web.service: wordpress-web + traefik.http.routers.wordpress-web.tls.certresolver: myresolver + # Local domain + traefik.http.routers.wordpress-web-local-insecure.rule: Host(`wordpress-web.${LOCAL_DOMAIN}`) + traefik.http.routers.wordpress-web-local-insecure.entrypoints: web + traefik.http.routers.wordpress-web-local-insecure.service: wordpress-web + traefik.http.routers.wordpress-web-local-insecure.middlewares: wordpress-web-redirect + # Local domain secure + traefik.http.routers.wordpress-web-local.rule: Host(`wordpress-web.${LOCAL_DOMAIN}`) + traefik.http.routers.wordpress-web-local.entrypoints: websecure + traefik.http.routers.wordpress-web-local.service: wordpress-web + traefik.http.routers.wordpress-web-local.tls: true + + wordpress-db: + container_name: wordpress-db + image: mariadb:11.1.3 + environment: + - MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD} + - MYSQL_DATABASE=wordpress + - MYSQL_USER=tipi + - MYSQL_PASSWORD=${DB_PASSWORD} + volumes: + - ${APP_DATA_DIR}/data/mariadb:/var/lib/mysql + restart: unless-stopped + networks: + - tipi_main_network \ No newline at end of file diff --git a/apps/wordpress/metadata/description.md b/apps/wordpress/metadata/description.md new file mode 100644 index 00000000..1021d791 --- /dev/null +++ b/apps/wordpress/metadata/description.md @@ -0,0 +1,39 @@ +# WordPress - The Ultimate Content Management System + +WordPress is the quintessential content management system (CMS) that has revolutionized the way websites and blogs are created, managed, and published on the internet. With its robust features, unparalleled flexibility, and user-friendly interface, WordPress has become the go-to choice for individuals, businesses, and organizations of all sizes. + +## Unleash Your Creativity + +Whether you're a seasoned web developer or a novice blogger, WordPress empowers you to bring your digital vision to life. Create stunning websites, blogs, portfolios, e-commerce platforms, and more with ease. Customize every aspect of your site, from layout and design to functionality and user experience. + +## Endless Possibilities with Themes and Plugins + +WordPress boasts an extensive library of themes and plugins that cater to every niche and purpose. Choose from thousands of free and premium themes to give your website a unique and polished look. Enhance your site's functionality with plugins that add features like contact forms, SEO optimization, e-commerce capabilities, and social media integration. + +## SEO-Friendly and Mobile-Responsive + +WordPress is designed with search engine optimization (SEO) in mind, making it easier for your content to rank higher on search engine results pages. Additionally, WordPress themes are mobile-responsive by default, ensuring that your site looks great and functions seamlessly on smartphones, tablets, and desktops. + +## Community and Support + +Join a global community of WordPress enthusiasts, developers, and experts who are always ready to lend a helping hand. With an extensive array of documentation, forums, and tutorials, you'll never be alone on your WordPress journey. Stay up-to-date with the latest trends and best practices in web development and design. + +## Open Source and Constant Innovation + +WordPress is open-source software, which means it's free to use, modify, and distribute. The platform is continually evolving, with regular updates and improvements to enhance security, performance, and usability. Benefit from a future-proof CMS that adapts to the ever-changing digital landscape. + +## Get Started Today + +Whether you're building a personal blog, a corporate website, an online store, or a community forum, WordPress provides the tools and resources you need to succeed. Begin your WordPress journey today and experience the limitless possibilities of the web. + +**Official Website:** [WordPress.org](https://wordpress.org) + +**GitHub Repository:** [WordPress on GitHub](https://github.com/WordPress/WordPress) + +**Documentation:** [WordPress Codex](https://codex.wordpress.org/) + +**Support and Community:** [WordPress Support Forums](https://wordpress.org/support/) + +**WordPress Plugins:** [WordPress Plugin Directory](https://wordpress.org/plugins/) + +**WordPress Themes:** [WordPress Theme Directory](https://wordpress.org/themes/) diff --git a/apps/wordpress/metadata/logo.jpg b/apps/wordpress/metadata/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7964dec682626ab40a3005c4c9bb4cb27bd0c9e8 GIT binary patch literal 17906 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 K9}+-