feat: adds docs for s3 compatible storage (#6538)

Co-authored-by: Matthias Nannt <mail@matthiasnannt.com>
This commit is contained in:
Anshuman Pandey
2025-09-15 13:04:46 +05:30
committed by GitHub
parent 41798266a0
commit 717adddeae
11 changed files with 399 additions and 222 deletions
+8 -5
View File
@@ -340,9 +340,11 @@ EOT
sed -i "s|# S3_BUCKET_NAME:|S3_BUCKET_NAME: \"$ext_s3_bucket\"|" docker-compose.yml
if [[ -n $ext_s3_endpoint ]]; then
sed -i "s|# S3_ENDPOINT_URL:|S3_ENDPOINT_URL: \"$ext_s3_endpoint\"|" docker-compose.yml
sed -i "s|S3_FORCE_PATH_STYLE: 0|S3_FORCE_PATH_STYLE: 1|" docker-compose.yml
# Ensure S3_FORCE_PATH_STYLE is enabled for S3-compatible endpoints (match commented or uncommented)
sed -i 's|#\? *S3_FORCE_PATH_STYLE:.*|S3_FORCE_PATH_STYLE: 1|' docker-compose.yml
else
sed -i "s|S3_FORCE_PATH_STYLE: 0|# S3_FORCE_PATH_STYLE:|" docker-compose.yml
# Comment out S3_FORCE_PATH_STYLE for native AWS S3 (match commented or uncommented)
sed -i 's|#\? *S3_FORCE_PATH_STYLE:.*|# S3_FORCE_PATH_STYLE:|' docker-compose.yml
fi
echo "🚗 External S3 configuration updated successfully!"
elif [[ $minio_storage == "y" ]]; then
@@ -356,7 +358,8 @@ EOT
else
sed -i "s|# S3_ENDPOINT_URL:|S3_ENDPOINT_URL: \"http://$files_domain\"|" docker-compose.yml
fi
sed -i "s|S3_FORCE_PATH_STYLE: 0|S3_FORCE_PATH_STYLE: 1|" docker-compose.yml
# Ensure S3_FORCE_PATH_STYLE is enabled for MinIO (match commented or uncommented)
sed -i 's|#\? *S3_FORCE_PATH_STYLE:.*|S3_FORCE_PATH_STYLE: 1|' docker-compose.yml
echo "🚗 MinIO S3 configuration updated successfully!"
fi
@@ -407,7 +410,7 @@ EOT
minio:
restart: always
image: minio/minio:RELEASE.2025-09-07T16-13-09Z
image: minio/minio@sha256:13582eff79c6605a2d315bdd0e70164142ea7e98fc8411e9e10d089502a6d883
command: server /data
environment:
MINIO_ROOT_USER: "$minio_root_user"
@@ -438,7 +441,7 @@ EOT
- "traefik.http.middlewares.minio-ratelimit.ratelimit.average=100"
- "traefik.http.middlewares.minio-ratelimit.ratelimit.burst=200"
minio-init:
image: minio/mc:latest
image: minio/mc@sha256:95b5f3f7969a5c5a9f3a700ba72d5c84172819e13385aaf916e237cf111ab868
depends_on:
minio:
condition: service_healthy
+17 -188
View File
@@ -5675,7 +5675,7 @@
},
"/api/v1/management/storage": {
"post": {
"description": "API endpoint for uploading public files. Uploaded files are public and accessible by anyone. This endpoint requires authentication. It accepts a JSON body with fileName, fileType, environmentId, and optionally allowedFileExtensions to restrict file types. On success, it returns a signed URL for uploading the file to S3 along with a local upload URL.",
"description": "API endpoint for uploading public files. Uploaded files are public and accessible by anyone. This endpoint requires authentication. It accepts a JSON body with fileName, fileType, environmentId, and optionally allowedFileExtensions to restrict file types. On success, it returns a signed URL for uploading the file to S3.",
"parameters": [
{
"example": "{{apiKey}}",
@@ -5732,8 +5732,15 @@
"example": {
"data": {
"fileUrl": "http://localhost:3000/storage/cm1ubebtj000614kqe4hs3c67/public/profile--fid--abc123.png",
"localUrl": "http://localhost:3000/storage/cm1ubebtj000614kqe4hs3c67/public/profile.png",
"signedUrl": "http://localhost:3000/api/v1/client/cm1ubebtj000614kqe4hs3c67/storage/public",
"presignedFields": {
"Policy": "base64EncodedPolicy",
"X-Amz-Algorithm": "AWS4-HMAC-SHA256",
"X-Amz-Credential": "your-credential",
"X-Amz-Date": "20250312T000000Z",
"X-Amz-Signature": "your-signature",
"key": "uploads/public/profile--fid--abc123.png"
},
"signedUrl": "https://s3.example.com/your-bucket",
"updatedFileName": "profile--fid--abc123.png"
}
},
@@ -5745,9 +5752,12 @@
"description": "URL where the uploaded file can be accessed.",
"type": "string"
},
"localUrl": {
"description": "URL for uploading the file to local storage.",
"type": "string"
"presignedFields": {
"additionalProperties": {
"type": "string"
},
"description": "Form fields to include in the multipart/form-data POST to S3.",
"type": "object"
},
"signedUrl": {
"description": "Signed URL for uploading the file to S3.",
@@ -5765,7 +5775,7 @@
}
}
},
"description": "OK - Returns the signed URL, updated file name, and file URL."
"description": "OK - Returns the signed URL, presigned fields, updated file name, and file URL."
},
"400": {
"content": {
@@ -5829,187 +5839,6 @@
"tags": ["Management API - Storage"]
}
},
"/api/v1/management/storage/local": {
"post": {
"description": "Management API endpoint for uploading public files to local storage. This endpoint requires authentication. File metadata is provided via headers (X-File-Type, X-File-Name, X-Environment-ID, X-Signature, X-UUID, X-Timestamp) and the file is provided as a multipart/form-data file field named \"file\". The \"Content-Type\" header must be set to a valid MIME type.",
"parameters": [
{
"example": "{{apiKey}}",
"in": "header",
"name": "x-api-key",
"required": true,
"schema": {
"type": "string"
}
},
{
"description": "MIME type of the file. Must be a valid MIME type.",
"in": "header",
"name": "X-File-Type",
"required": true,
"schema": {
"type": "string"
}
},
{
"description": "URI encoded file name.",
"in": "header",
"name": "X-File-Name",
"required": true,
"schema": {
"type": "string"
}
},
{
"description": "ID of the environment.",
"in": "header",
"name": "X-Environment-ID",
"required": true,
"schema": {
"type": "string"
}
},
{
"description": "Signature for verifying the request.",
"in": "header",
"name": "X-Signature",
"required": true,
"schema": {
"type": "string"
}
},
{
"description": "Unique identifier for the signed upload.",
"in": "header",
"name": "X-UUID",
"required": true,
"schema": {
"type": "string"
}
},
{
"description": "Timestamp used for the signature.",
"in": "header",
"name": "X-Timestamp",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"content": {
"multipart/form-data": {
"schema": {
"properties": {
"file": {
"description": "The file to be uploaded as a valid file object (buffer).",
"format": "binary",
"type": "string"
}
},
"required": ["file"],
"type": "object"
}
}
},
"required": true
},
"responses": {
"200": {
"content": {
"application/json": {
"example": {
"data": {
"message": "File uploaded successfully"
}
},
"schema": {
"properties": {
"data": {
"properties": {
"message": {
"description": "Success message.",
"type": "string"
}
},
"type": "object"
}
},
"type": "object"
}
}
},
"description": "OK - File uploaded successfully."
},
"400": {
"content": {
"application/json": {
"example": {
"error": "fileType is required"
},
"schema": {
"properties": {
"error": {
"description": "Detailed error message.",
"type": "string"
}
},
"type": "object"
}
}
},
"description": "Bad Request - Missing required fields, invalid header values, or file issues."
},
"401": {
"content": {
"application/json": {
"example": {
"error": "Not authenticated"
},
"schema": {
"properties": {
"error": {
"description": "Detailed error message.",
"type": "string"
}
},
"type": "object"
}
}
},
"description": "Unauthorized - Authentication failed, invalid signature, or user not authorized."
},
"500": {
"content": {
"application/json": {
"example": {
"error": "File upload failed"
},
"schema": {
"properties": {
"error": {
"description": "Detailed error message.",
"type": "string"
}
},
"type": "object"
}
}
},
"description": "Internal Server Error - File upload failed due to server error."
}
},
"servers": [
{
"description": "Formbricks API Server",
"url": "https://app.formbricks.com/api/v1"
}
],
"summary": "Upload Public File to Local Storage",
"tags": ["Management API - Storage"]
}
},
"/api/v1/management/surveys": {
"get": {
"description": "Fetches all existing surveys",
+1
View File
@@ -3843,6 +3843,7 @@ components:
type: string
enum:
- draft
- scheduled
- inProgress
- paused
- completed
+1
View File
@@ -225,6 +225,7 @@
"self-hosting/configuration/custom-ssl",
"self-hosting/configuration/environment-variables",
"self-hosting/configuration/smtp",
"self-hosting/configuration/file-uploads",
"self-hosting/configuration/domain-configuration",
{
"group": "Auth & SSO",
@@ -0,0 +1,316 @@
---
title: "File Uploads Configuration"
description: "Configure file storage for survey images, file uploads, and project assets in your self-hosted Formbricks instance"
icon: "upload"
---
Formbricks requires S3-compatible storage for file uploads. You can use external cloud storage services or the bundled MinIO option for a self-hosted solution.
## Why Configure File Uploads?
Setting up file storage enables important features in Formbricks, including:
- Adding images to surveys (questions, backgrounds, logos)
- 'File Upload' and 'Picture Selection' question types
- Project logos and branding
- Custom organization logos in emails
- Survey background images from uploads
<Warning>
If file uploads are not configured, the above features will be disabled and users won't be able to upload
files or images.
</Warning>
## Storage Options
Formbricks supports S3-compatible storage with two main configurations:
### 1. External S3-Compatible Storage
Use cloud storage services for production deployments:
- **AWS S3** (Amazon Web Services)
- **DigitalOcean Spaces**
- **Backblaze B2**
- **Wasabi**
- **StorJ**
- Any S3-compatible storage service
### 2. Bundled MinIO Storage (Self-Hosted)
<Warning>
**Important**: MinIO requires a dedicated subdomain to function properly. You must configure a subdomain
like `files.yourdomain.com` that points to your server. MinIO will not work without this subdomain setup.
</Warning>
MinIO provides a self-hosted S3-compatible storage solution that runs alongside Formbricks. This option:
- Runs in a Docker container alongside Formbricks
- Provides full S3 API compatibility
- Requires minimal additional configuration
## Configuration Methods
### Option 1: One-Click Setup Script
When using the Formbricks installation script, you'll be prompted to configure file uploads:
```bash
📁 Do you want to configure file uploads?
If you skip this, the following features will be disabled:
- Adding images to surveys (e.g., in questions or as background)
- 'File Upload' and 'Picture Selection' question types
- Project logos
- Custom organization logo in emails
Configure file uploads now? [Y/n] y
```
#### External S3-Compatible Storage
Choose this option for AWS S3, DigitalOcean Spaces, or other cloud providers:
```bash
🗄️ Do you want to use an external S3-compatible storage (AWS S3/DO Spaces/etc.)? [y/N] y
🔧 Enter S3 configuration (leave Endpoint empty for AWS S3):
S3 Access Key: your_access_key
S3 Secret Key: your_secret_key
S3 Region (e.g., us-east-1): us-east-1
S3 Bucket Name: your-bucket-name
S3 Endpoint URL (leave empty if you are using AWS S3): https://your-endpoint.com
```
#### Bundled MinIO Storage
Choose this option for a self-hosted S3-compatible storage that runs alongside Formbricks:
<Note>
**Critical Requirement**: Before proceeding, ensure you have configured a subdomain (e.g.,
`files.yourdomain.com`) that points to your server's IP address. MinIO will not function without this
subdomain setup.
</Note>
```bash
🗄️ Do you want to use an external S3-compatible storage (AWS S3/DO Spaces/etc.)? [y/N] n
🔗 Enter the files subdomain for object storage (e.g., files.yourdomain.com): files.yourdomain.com
```
The script will automatically:
- Generate secure MinIO credentials
- Create the storage bucket
- Configure SSL certificates for the files subdomain
- Configure Traefik routing for the subdomain
### Option 2: Manual Environment Variables
Add the following environment variables to your `docker-compose.yml` or `.env` file:
#### For S3-Compatible Storage
```bash
# S3 Storage Configuration
S3_ACCESS_KEY=your_access_key
S3_SECRET_KEY=your_secret_key
S3_REGION=us-east-1
S3_BUCKET_NAME=your-bucket-name
# Optional: For third-party S3-compatible services (leave empty for AWS S3)
S3_ENDPOINT_URL=https://your-endpoint.com
# Enable path-style URLs for third-party services (1 for enabled, 0 for disabled)
S3_FORCE_PATH_STYLE=1
```
## Provider-Specific Examples
### AWS S3
```bash
S3_ACCESS_KEY=AKIA1234567890EXAMPLE
S3_SECRET_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
S3_REGION=us-east-1
S3_BUCKET_NAME=my-formbricks-uploads
# S3_ENDPOINT_URL is not needed for AWS S3
# S3_FORCE_PATH_STYLE=0
```
### DigitalOcean Spaces
```bash
S3_ACCESS_KEY=your_spaces_key
S3_SECRET_KEY=your_spaces_secret
S3_REGION=nyc3
S3_BUCKET_NAME=my-formbricks-space
S3_ENDPOINT_URL=https://nyc3.digitaloceanspaces.com
S3_FORCE_PATH_STYLE=1
```
### MinIO (Self-Hosted)
```bash
S3_ACCESS_KEY=minio_access_key
S3_SECRET_KEY=minio_secret_key
S3_REGION=us-east-1
S3_BUCKET_NAME=formbricks-uploads
S3_ENDPOINT_URL=https://files.yourdomain.com
S3_FORCE_PATH_STYLE=1
```
### Backblaze B2
```bash
S3_ACCESS_KEY=your_b2_key_id
S3_SECRET_KEY=your_b2_application_key
S3_REGION=us-west-000
S3_BUCKET_NAME=my-formbricks-bucket
S3_ENDPOINT_URL=https://s3.us-west-000.backblazeb2.com
S3_FORCE_PATH_STYLE=1
```
## Bundled MinIO Setup
When using the bundled MinIO option through the setup script, you get:
### Automatic Configuration
- **Storage Service**: MinIO running in a Docker container
- **Credentials**: Auto-generated secure access keys
- **Bucket**: Automatically created `formbricks-uploads` bucket
- **SSL**: Automatic certificate generation for the files subdomain
### Access Information
After setup, you'll see:
```bash
🗄️ MinIO Storage Setup Complete:
• S3 API: https://files.yourdomain.com
• Access Key: formbricks-a1b2c3d4
• Bucket: formbricks-uploads (✅ automatically created)
```
### DNS Requirements
<Warning>
**Critical for MinIO**: The subdomain configuration is mandatory for MinIO to function. Without proper
subdomain DNS setup, MinIO will fail to work entirely.
</Warning>
For the bundled MinIO setup, ensure:
1. **Main domain**: `yourdomain.com` points to your server IP
2. **Files subdomain**: `files.yourdomain.com` points to your server IP (this is required for MinIO to work)
3. **Firewall**: Ports 80 and 443 are open in your server's firewall
4. **DNS propagation**: Allow time for DNS changes to propagate globally
## Docker Compose Configuration
For manual setup, update your `docker-compose.yml`:
```yaml
services:
formbricks:
image: ghcr.io/formbricks/formbricks:latest
environment:
# ... other environment variables ...
# S3 Storage Configuration
S3_ACCESS_KEY: your_access_key
S3_SECRET_KEY: your_secret_key
S3_REGION: us-east-1
S3_BUCKET_NAME: your-bucket-name
S3_ENDPOINT_URL: https://your-endpoint.com # Optional
S3_FORCE_PATH_STYLE: 1 # For third-party services
volumes:
- uploads:/home/nextjs/apps/web/uploads/ # Still needed for temporary files
```
## Security Considerations
### S3 Bucket Permissions
Configure your S3 bucket with a least-privileged policy:
1. **Scoped Public Read Access**: Only allow public read access to specific prefixes where needed
2. **Restricted Write Access**: Only your Formbricks instance should be able to upload files
3. **CORS Configuration**: Allow requests from your Formbricks domain
Example least-privileged S3 bucket policy:
```json
{
"Statement": [
{
"Action": "s3:GetObject",
"Effect": "Allow",
"Principal": "*",
"Resource": "arn:aws:s3:::your-bucket-name/uploads/public/*",
"Sid": "PublicReadForPublicUploads"
},
{
"Action": ["s3:PutObject", "s3:PutObjectAcl"],
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:user/formbricks-service"
},
"Resource": "arn:aws:s3:::your-bucket-name/*",
"Sid": "AllowFormbricksWrite"
}
],
"Version": "2012-10-17"
}
```
### MinIO Security
When using bundled MinIO:
- Credentials are auto-generated and secure
- Access is restricted through Traefik proxy
- CORS is automatically configured
- Rate limiting is applied to prevent abuse
- A bucket policy with the least privileges is applied to the bucket
## Troubleshooting
### Common Issues
**Files not uploading:**
1. Check that S3 credentials are correct
2. Verify bucket exists and is accessible
3. Ensure bucket permissions allow uploads from your server
4. Check network connectivity to S3 endpoint
**Images not displaying in surveys:**
1. Verify bucket has public read access
2. Check CORS configuration allows requests from your domain
3. Ensure S3_ENDPOINT_URL is correctly set for third-party services
**MinIO not starting:**
1. **Verify subdomain DNS**: Ensure `files.yourdomain.com` points to your server IP (this is the most common issue)
2. **Check DNS propagation**: Use tools like `nslookup` or `dig` to verify DNS resolution
3. **Verify ports**: Ensure ports 80 and 443 are open in your firewall
4. **SSL certificate**: Check that SSL certificate generation completed successfully
5. **Container logs**: Check Docker container logs: `docker compose logs minio`
### Testing Your Configuration
To test if file uploads are working:
1. **Admin Panel**: Try uploading a project logo in the project settings
2. **Survey Editor**: Attempt to add a background image to a survey
3. **Question Types**: Create a 'File Upload' or 'Picture Selection' question
4. **Check Logs**: Monitor container logs for any storage-related errors
```bash
# Check Formbricks logs
docker compose logs formbricks
# Check MinIO logs (if using bundled MinIO)
docker compose logs minio
```
For additional help, join the conversation on [GitHub Discussions](https://github.com/formbricks/formbricks/discussions).
@@ -4,14 +4,16 @@ description: "Branding the emails that are sent to your respondents."
icon: "envelope"
---
<Note>
**Self-Hosting Requirements**: Uploading custom organization logos for emails requires file upload storage
to be configured. If you're self-hosting Formbricks, make sure to [configure file
uploads](/self-hosting/configuration/file-uploads) before using this feature.
</Note>
Email branding is a white-label feature that allows you to customize the email that is sent to your users. You can upload a logo of your company and use it in the email.
<Note>
Email branding is part of the Formbricks [Enterprise Edition](/self-hosting/advanced/license).
</Note>
<Info>
Only the Owner and Managers of the organization can modify the logo.
</Info>
<Note>Email branding is part of the Formbricks [Enterprise Edition](/self-hosting/advanced/license).</Note>
<Info>Only the Owner and Managers of the organization can modify the logo.</Info>
## How to upload a logo
@@ -1,10 +1,15 @@
---
title: "Styling Theme"
description:
"Keep the survey styling consistent over all surveys with a Styling Theme. Customize the colors, fonts, and other styling options to match your brand's aesthetic."
description: "Keep the survey styling consistent over all surveys with a Styling Theme. Customize the colors, fonts, and other styling options to match your brand's aesthetic."
icon: "palette"
---
<Note>
**Self-Hosting Requirements**: Uploading custom background images and brand logos requires file upload
storage to be configured. If you're self-hosting Formbricks, make sure to [configure file
uploads](/self-hosting/configuration/file-uploads) before using these features.
</Note>
Keep the survey styling consistent over all surveys with a Styling Theme. Customize the colors, fonts, and other styling options to match your brand's aesthetic.
## Configuration
@@ -20,7 +25,6 @@ In the left side bar, you find the `Configuration` page. On this page you find t
![Form styling options UI](/images/xm-and-surveys/core-features/styling-theme/form-settings.webp)
- **Brand Color**: Sets the primary color tone of the survey.
- **Text Color**: This is a single color scheme that will be used across to display all the text on your survey. Ensures all text is readable against the background.
- **Input Color:** Alters the border color of input fields.
@@ -63,17 +67,14 @@ Customize your survey with your brand's logo.
![Choose a link survey template](/images/xm-and-surveys/core-features/styling-theme/step-five.webp)
3. Add a background color: If youve uploaded a transparent image and want to add background to it, enable this toggle and select the color of your choice.
![Choose a link survey template](/images/xm-and-surveys/core-features/styling-theme/step-six.webp)
4. Remember to save your changes!
![Choose a link survey template](/images/xm-and-surveys/core-features/styling-theme/step-seven.webp)
<Note>The logo settings apply across all Link Surveys pages.</Note>
## Overwrite Styling Theme
@@ -4,6 +4,12 @@ description: "Enhance your questions by adding images or videos. This makes inst
icon: "image"
---
<Note>
**Self-Hosting Requirements**: Adding images to questions requires file upload storage to be configured. If
you're self-hosting Formbricks, make sure to [configure file
uploads](/self-hosting/configuration/file-uploads) before using this feature.
</Note>
## How to Add Images
Click the icon on the right side of the question to add an image or video:
@@ -25,6 +31,6 @@ Toggle to add a video via link:
We support YouTube, Vimeo, and Loom URLs.
<Note>
**YouTube Privacy Mode**: This option reduces tracking by converting YouTube
URLs to no-cookie URLs. It only works with YouTube.
**YouTube Privacy Mode**: This option reduces tracking by converting YouTube URLs to no-cookie URLs. It only
works with YouTube.
</Note>
@@ -4,6 +4,12 @@ description: "Customize link titles, descriptions, and preview images to make yo
icon: "gear"
---
<Note>
**Self-Hosting Requirements**: Adding a preview image requires file upload storage to be configured. If
you're self-hosting Formbricks, make sure to [configure file
uploads](/self-hosting/configuration/file-uploads) before using this feature.
</Note>
## What are Link Settings?
Link Settings allow you to configure the metadata (Open Graph tags) for your survey links, controlling how they appear when shared:
@@ -14,7 +20,6 @@ Link Settings allow you to configure the metadata (Open Graph tags) for your sur
![Link Settings](/images/xm-and-surveys/surveys/link-surveys/link-settings/link-settings.webp)
## Configuring Link Metadata
<Steps>
@@ -22,21 +27,22 @@ Link Settings allow you to configure the metadata (Open Graph tags) for your sur
Navigate to your survey's Summary page and click the **Share survey** button in the top toolbar.
</Step>
<Step title="Open Link Settings tab">
In the Share Modal, click on the **Link Settings** tab to access the customization options.
</Step>
<Step title="Open Link Settings tab">
In the Share Modal, click on the **Link Settings** tab to access the customization options.
</Step>
<Step title="Customize your link title">
Enter a title for your survey link. This will appear as the main headline when your link is shared.
</Step>
<Step title="Customize your link title">
Enter a title for your survey link. This will appear as the main headline when your link is shared.
</Step>
<Step title="Add a link description">
Write a brief description for your survey. This will appear as the description of your Survey Link.
</Step>
<Step title="Add a link description">
Write a brief description for your survey. This will appear as the description of your Survey Link.
</Step>
<Step title="Upload a preview image">
Add a custom image that will display when your link is shared. This makes your survey more visually appealing and can increase engagement.
</Step>
<Step title="Upload a preview image">
Add a custom image that will display when your link is shared. This makes your survey more visually
appealing and can increase engagement.
</Step>
<Step title="Save your settings">
Click **Save** to apply your link settings. These changes will take effect immediately for all future link shares.
@@ -4,6 +4,12 @@ description: "The File Upload question type allows respondents to upload files r
icon: "upload"
---
<Note>
**Self-Hosting Requirements**: This question type requires file upload storage to be configured. If you're
self-hosting Formbricks, make sure to [configure file uploads](/self-hosting/configuration/file-uploads)
before using this feature.
</Note>
<iframe
title="Survey Embed"
src="https://app.formbricks.com/s/oo4e6vva48w0trn01ht8krwo"
@@ -1,10 +1,15 @@
---
title: "Picture Selection"
description:
"Picture selection questions allow respondents to select one or more images from a list"
description: "Picture selection questions allow respondents to select one or more images from a list"
icon: "image"
---
<Note>
**Self-Hosting Requirements**: This question type requires file upload storage to be configured for image
uploads. If you're self-hosting Formbricks, make sure to [configure file
uploads](/self-hosting/configuration/file-uploads) before using this feature.
</Note>
Picture selection questions allow respondents to select one or more images from a list. Displays a title and a list of images for the respondent to choose from.
<iframe
@@ -24,6 +29,7 @@ Picture selection questions allow respondents to select one or more images from
## Elements
![Overview of Picture Selection question type](/images/xm-and-surveys/core-features/question-type/select-picture.webp)
### Title
Add a clear title to inform the respondent what information you are asking for.