diff --git a/flarum/metadata/app.json b/flarum/metadata/app.json
new file mode 100644
index 00000000..876a3d88
--- /dev/null
+++ b/flarum/metadata/app.json
@@ -0,0 +1,14 @@
+{
+ "key": "flarum",
+ "name": "flarum",
+ "tags": ["WebSite"],
+ "versions": ["latest"],
+ "shortDescZh": "新一代的论坛软件,使在线讨论变得有趣。",
+ "shortDescEn": "The next-generation forum software that makes online discussion fun.",
+ "type": "website",
+ "limit": 0,
+ "crossVersionUpdate": true,
+ "website": "https://github.com/crazy-max/docker-flarum",
+ "github": "https://github.com/crazy-max/docker-flarum",
+ "document": "https://github.com/crazy-max/docker-flarum"
+}
diff --git a/flarum/metadata/logo.png b/flarum/metadata/logo.png
new file mode 100644
index 00000000..e3511daa
Binary files /dev/null and b/flarum/metadata/logo.png differ
diff --git a/flarum/versions/latest/.env.sample b/flarum/versions/latest/.env.sample
new file mode 100644
index 00000000..ffddfab0
--- /dev/null
+++ b/flarum/versions/latest/.env.sample
@@ -0,0 +1,10 @@
+CONTAINER_NAME="flarum"
+PANEL_APP_PORT_HTTP="40020"
+DATA_PATH="./data"
+PANEL_DB_HOST="127.0.0.1"
+FLARUM_DB_PORT="3306"
+PANEL_DB_NAME="flarum"
+PANEL_DB_USER="flarum"
+PANEL_DB_USER_PASSWORD="MyDBPWD_brls9UwcRasl"
+PANEL_DB_PREFIX="flarum_"
+Dockerized_HOST="127.0.0.1"
\ No newline at end of file
diff --git a/flarum/versions/latest/README.md b/flarum/versions/latest/README.md
new file mode 100644
index 00000000..77220bc1
--- /dev/null
+++ b/flarum/versions/latest/README.md
@@ -0,0 +1,256 @@
+

+
+
+
+
+
+
+
+
+
+
+## About
+
+Docker image for [Flarum](https://flarum.org/), the next-generation forum
+software that makes online discussion fun.
+
+> **Note**
+>
+> Want to be notified of new releases? Check out 🔔 [Diun (Docker Image Update Notifier)](https://github.com/crazy-max/diun)
+> project!
+
+___
+
+- [About](#about)
+- [Features](#features)
+- [Build locally](#build-locally)
+- [Image](#image)
+- [Environment variables](#environment-variables)
+ - [General](#general)
+ - [Flarum](#flarum)
+ - [Database](#database)
+- [Volumes](#volumes)
+- [Ports](#ports)
+- [Usage](#usage)
+ - [Docker Compose](#docker-compose)
+ - [Command line](#command-line)
+- [Upgrade](#upgrade)
+- [Notes](#notes)
+ - [First launch](#first-launch)
+ - [Manage extensions](#manage-extensions)
+ - [Sending mails with SMTP](#sending-mails-with-smtp)
+- [Contributing](#contributing)
+- [License](#license)
+
+## Features
+
+* Run as non-root user
+* Multi-platform image
+* [s6-overlay](https://github.com/just-containers/s6-overlay/) as process supervisor
+* [msmtpd SMTP relay](https://github.com/crazy-max/docker-msmtpd) image to send emails
+* [Traefik](https://github.com/containous/traefik-library-image) as reverse proxy and creation/renewal of Let's Encrypt certificates (see [this template](examples/traefik))
+
+## Build locally
+
+```shell
+git clone https://github.com/crazy-max/docker-flarum.git
+cd docker-flarum
+
+# Build image and output to docker (default)
+docker buildx bake
+
+# Build multi-platform image
+docker buildx bake image-all
+```
+
+## Image
+
+| Registry | Image |
+|--------------------------------------------------------------------------------------------------|---------------------------------|
+| [Docker Hub](https://hub.docker.com/r/crazymax/flarum/) | `crazymax/flarum` |
+| [GitHub Container Registry](https://github.com/users/crazy-max/packages/container/package/flarum) | `ghcr.io/crazy-max/flarum` |
+
+Following platforms for this image are available:
+
+```
+$ docker run --rm mplatform/mquery crazymax/flarum:latest
+Image: crazymax/flarum:latest
+ * Manifest List: Yes
+ * Supported platforms:
+ - linux/amd64
+ - linux/arm/v6
+ - linux/arm/v7
+ - linux/arm64
+```
+
+## Environment variables
+
+### General
+
+* `TZ`: The timezone assigned to the container (default `UTC`)
+* `PUID`: Flarum user id (default `1000`)
+* `PGID`: Flarum group id (default `1000`)
+* `MEMORY_LIMIT`: PHP memory limit (default `256M`)
+* `UPLOAD_MAX_SIZE`: Upload max size (default `16M`)
+* `CLEAR_ENV`: Clear environment in FPM workers (default `yes`)
+* `OPCACHE_MEM_SIZE`: PHP OpCache memory consumption (default `128`)
+* `LISTEN_IPV6`: Enable IPv6 for Nginx (default `true`)
+* `REAL_IP_FROM`: Trusted addresses that are known to send correct replacement addresses (default `0.0.0.0/32`)
+* `REAL_IP_HEADER`: Request header field whose value will be used to replace the client address (default `X-Forwarded-For`)
+* `LOG_IP_VAR`: Use another variable to retrieve the remote IP address for access [log_format](http://nginx.org/en/docs/http/ngx_http_log_module.html#log_format) on Nginx. (default `remote_addr`)
+
+### Flarum
+
+* `FLARUM_DEBUG`: Enables or disables debug mode, used to troubleshoot issues (default `false`)
+* `FLARUM_BASE_URL`: The URL to your Flarum installation **required**
+* `FLARUM_FORUM_TITLE`: Flarum forum title, only used during first installation (default `Flarum Dockerized`)
+* `FLARUM_API_PATH`: Flarum api path (default `api`)
+* `FLARUM_ADMIN_PATH`: Flarum admin path (default `admin`)
+* `FLARUM_POWEREDBY_HEADER`: Set Flarum's `X-Powered-By` header (default `true`)
+* `FLARUM_REFERRER_POLICY`: Referrer policy (default `same-origin`)
+* `FLARUM_COOKIE_SAMESITE`: Set `SameSite` attribute of `Set-Cookie` (default `lax`)
+
+### Database
+
+* `DB_HOST`: MySQL database hostname / IP address **required**
+* `DB_PORT`: MySQL database port (default `3306`)
+* `DB_NAME`: MySQL database name (default `flarum`)
+* `DB_USER`: MySQL user (default `flarum`)
+* `DB_PASSWORD`: MySQL password
+* `DB_PREFIX`: MySQL database prefix (default `flarum_`)
+* `DB_NOPREFIX`: Enforce no prefix for the MySQL database (default `false`)
+* `DB_TIMEOUT`: Time in seconds after which we stop trying to reach the MySQL server (useful for clusters, default `60`)
+
+> 💡 `DB_USER_FILE` and `DB_PASSWORD_FILE` can be used to fill in the value from a file, especially for Docker's
+> secrets feature.
+
+## Volumes
+
+* `/data`: Contains assets, extensions and storage
+
+> :warning: Note that the volume should be owned by the user/group with the specified `PUID` and `PGID`. If you
+> don't give the volume correct permissions, the container may not start.
+
+## Ports
+
+* `8000`: HTTP port
+
+## Usage
+
+### Docker Compose
+
+Docker compose is the recommended way to run this image. You can use the following
+[docker compose template](examples/compose/docker-compose.yml), then run the container:
+
+```bash
+docker-compose up -d
+docker-compose logs -f
+```
+
+### Command line
+
+You can also use the following minimal command:
+
+```bash
+docker run -d -p 8000:8000 --name flarum \
+ -v $(pwd)/data:/data \
+ -e "DB_HOST=db" \
+ -e "FLARUM_BASE_URL=http://127.0.0.1:8000" \
+ crazymax/flarum:latest
+```
+
+> `-e "DB_HOST=db"`
+> :warning: `db` must be a running MySQL instance
+
+## Upgrade
+
+You can upgrade Flarum automatically through the UI, it works well. But I recommend to recreate the container
+whenever I push an update:
+
+```bash
+docker-compose pull
+docker-compose up -d
+```
+
+## Notes
+
+### First launch
+
+On first launch, an initial administrator user will be created:
+
+| Login | Password |
+|----------|----------|
+| `flarum` | `flarum` |
+
+### Manage extensions
+
+You can install [Flarum extensions](https://extiverse.com/) from the command line using a
+[specially crafted script](rootfs/usr/local/bin/extension) with this image:
+
+`docker-compose exec flarum extension require `
+
+To remove an extension:
+
+`docker-compose exec flarum extension remove `
+
+To list all extensions:
+
+`docker-compose exec flarum extension list`
+
+Example with [`fof/upload`](https://extiverse.com/extension/fof/upload) extension:
+
+```
+$ docker-compose exec flarum extension require fof/upload
+Using version ^1.0 for fof/upload
+./composer.json has been updated
+Running composer update fof/upload
+Loading composer repositories with package information
+Updating dependencies
+Lock file operations: 5 installs, 0 updates, 0 removals
+ - Locking fof/upload (1.0.0)
+ - Locking guzzlehttp/guzzle (7.3.0)
+ - Locking guzzlehttp/promises (1.4.1)
+ - Locking psr/http-client (1.0.1)
+ - Locking softcreatr/php-mime-detector (3.2.0)
+Writing lock file
+Installing dependencies from lock file (including require-dev)
+Package operations: 5 installs, 0 updates, 0 removals
+ - Downloading softcreatr/php-mime-detector (3.2.0)
+ - Downloading psr/http-client (1.0.1)
+ - Downloading guzzlehttp/promises (1.4.1)
+ - Downloading guzzlehttp/guzzle (7.3.0)
+ - Downloading fof/upload (1.0.0)
+ - Installing softcreatr/php-mime-detector (3.2.0): Extracting archive
+ - Installing psr/http-client (1.0.1): Extracting archive
+ - Installing guzzlehttp/promises (1.4.1): Extracting archive
+ - Installing guzzlehttp/guzzle (7.3.0): Extracting archive
+ - Installing fof/upload (1.0.0): Extracting archive
+2 package suggestions were added by new dependencies, use `composer suggest` to see details.
+Generating autoload files
+70 packages you are using are looking for funding.
+Use the `composer fund` command to find out more!
+fof/upload extension added
+Clearing the cache...
+```
+
+> :warning: You cannot use [Bazaar marketplace extension](https://discuss.flarum.org/d/5151-bazaar-the-extension-marketplace)
+> to install extensions for now.
+
+### Sending mails with SMTP
+
+You can use our SMTP relay `msmtpd` service published on port `2500` and declared in our [`docker-compose.yml`](examples/compose/docker-compose.yml):
+
+
+
+## Contributing
+
+Want to contribute? Awesome! The most basic way to show your support is to star the project, or to raise issues. You
+can also support this project by [**becoming a sponsor on GitHub**](https://github.com/sponsors/crazy-max) or by making
+a [Paypal donation](https://www.paypal.me/crazyws) to ensure this journey continues indefinitely!
+
+Thanks again for your support, it is much appreciated! :pray:
+
+## License
+
+MIT. See `LICENSE` for more details.
+
diff --git a/flarum/versions/latest/config.json b/flarum/versions/latest/config.json
new file mode 100644
index 00000000..b012984a
--- /dev/null
+++ b/flarum/versions/latest/config.json
@@ -0,0 +1,104 @@
+{
+ "formFields": [
+ {
+ "type": "apps",
+ "labelZh": "数据库服务",
+ "labelEn": "Database Service",
+ "required": true,
+ "default": "mysql",
+ "values": [{
+ "label": "MySQL",
+ "value": "mysql"
+ }],
+ "child": {
+ "type": "service",
+ "labelZh": "数据库服务",
+ "labelEn": "Database Service",
+ "required": true,
+ "default": "",
+ "envKey": "PANEL_DB_HOST"
+ },
+ "params": [
+ {
+ "type": "param",
+ "key": "mysql",
+ "value": "3306",
+ "envKey": "FLARUM_DB_PORT"
+ },
+ {
+ "type": "param",
+ "key": "postgresql",
+ "value": "5432",
+ "envKey": "FLARUM_DB_PORT"
+ }
+ ]
+ },
+ {
+ "type": "text",
+ "labelZh": "数据库名",
+ "labelEn": "Database",
+ "required": true,
+ "default": "flarum",
+ "random": true,
+ "rule": "paramCommon",
+ "envKey": "PANEL_DB_NAME"
+ },
+ {
+ "type": "text",
+ "labelZh": "数据库用户",
+ "labelEn": "User",
+ "required": true,
+ "default": "flarum",
+ "random": true,
+ "rule": "paramCommon",
+ "envKey": "PANEL_DB_USER"
+ },
+ {
+ "type": "password",
+ "labelZh": "数据库用户密码",
+ "labelEn": "Password",
+ "required": true,
+ "default": "flarum",
+ "random": true,
+ "rule": "paramComplexity",
+ "envKey": "PANEL_DB_USER_PASSWORD"
+ },
+ {
+ "type": "text",
+ "labelZh": "数据库前缀",
+ "labelEn": "Database prefix",
+ "required": true,
+ "default": "flarum_",
+ "envKey": "PANEL_DB_PREFIX"
+ },
+ {
+ "type": "number",
+ "labelZh": "端口",
+ "labelEn": "Port",
+ "required": true,
+ "default": 40020,
+ "rule": "paramPort",
+ "envKey": "PANEL_APP_PORT_HTTP",
+ "edit": true
+ },
+ {
+ "type": "text",
+ "labelZh": "数据存放文件夹",
+ "labelEn": "Data storage folder",
+ "required": true,
+ "default": "./data",
+ "envKey": "DATA_PATH",
+ "edit": true
+ },
+ {
+ "type": "text",
+ "labelZh": "本机IP",
+ "labelEn": "Local IP",
+ "required": true,
+ "default": "127.0.0.1",
+ "envKey": "Dockerized_HOST",
+ "edit": true
+ }
+ ]
+}
+
diff --git a/flarum/versions/latest/data/.gitkeep b/flarum/versions/latest/data/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/flarum/versions/latest/docker-compose.yml b/flarum/versions/latest/docker-compose.yml
new file mode 100644
index 00000000..20b5ae17
--- /dev/null
+++ b/flarum/versions/latest/docker-compose.yml
@@ -0,0 +1,36 @@
+version: "3"
+services:
+ flarum:
+ container_name: ${CONTAINER_NAME}
+ restart: unless-stopped
+ networks:
+ - 1panel-network
+ ports:
+ - "${PANEL_APP_PORT_HTTP}:8000"
+ volumes:
+ - "${DATA_PATH}:/data"
+ environment:
+ - TZ=Asia/Shanghai
+ - PUID=1000
+ - PGID=1000
+ - MEMORY_LIMIT=256M
+ - UPLOAD_MAX_SIZE=256M
+ - CLEAR_ENV=yes
+ - OPCACHE_MEM_SIZE=128M
+ - LISTEN_IPV6=true
+ - REAL_IP_FROM=0.0.0.0/32
+ - DB_HOST=${PANEL_DB_HOST}
+ - DB_PORT=${FLARUM_DB_PORT}
+ - DB_NAME=${PANEL_DB_NAME}
+ - DB_USER=${PANEL_DB_USER}
+ - DB_PASSWORD=${PANEL_DB_USER_PASSWORD}
+ - DB_PREFIX=${PANEL_DB_PREFIX}
+ - DB_NOPREFIX=false
+ - DB_TIMEOUT=60
+ - FLARUM_BASE_URL=http://${Dockerized_HOST}:${PANEL_APP_PORT_HTTP}
+ image: crazymax/flarum:latest
+ labels:
+ createdBy: Apps
+networks:
+ 1panel-network:
+ external: true
diff --git a/list.json b/list.json
index b2fd2f31..7ca64b3c 100644
--- a/list.json
+++ b/list.json
@@ -97,6 +97,20 @@
"website": "https://github.com/containrrr/watchtower",
"github": "https://github.com/containrrr/watchtower",
"document": "https://containrrr.dev/watchtower/"
+ },
+ {
+ "key": "flarum",
+ "name": "flarum",
+ "tags": ["WebSite"],
+ "versions": ["latest"],
+ "shortDescZh": "新一代的论坛软件,使在线讨论变得有趣。",
+ "shortDescEn": "The next-generation forum software that makes online discussion fun.",
+ "type": "website",
+ "limit": 0,
+ "crossVersionUpdate": true,
+ "website": "https://github.com/crazy-max/docker-flarum",
+ "github": "https://github.com/crazy-max/docker-flarum",
+ "document": "https://github.com/crazy-max/docker-flarum"
}
]
}