mirror of
https://github.com/formbricks/formbricks.git
synced 2026-04-20 20:49:16 -05:00
feat: adds docs for s3 compatible storage (#6538)
Co-authored-by: Matthias Nannt <mail@matthiasnannt.com>
This commit is contained in:
@@ -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
@@ -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",
|
||||
|
||||
@@ -3843,6 +3843,7 @@ components:
|
||||
type: string
|
||||
enum:
|
||||
- draft
|
||||
- scheduled
|
||||
- inProgress
|
||||
- paused
|
||||
- completed
|
||||
|
||||
@@ -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
|
||||
|
||||

|
||||
|
||||
|
||||
- **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.
|
||||
|
||||

|
||||
|
||||
|
||||
3. Add a background color: If you’ve uploaded a transparent image and want to add background to it, enable this toggle and select the color of your choice.
|
||||
|
||||

|
||||
|
||||
|
||||
4. Remember to save your changes!
|
||||
|
||||

|
||||
|
||||
|
||||
<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
|
||||
|
||||

|
||||
|
||||
|
||||
## 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
|
||||
|
||||

|
||||
|
||||
### Title
|
||||
|
||||
Add a clear title to inform the respondent what information you are asking for.
|
||||
|
||||
Reference in New Issue
Block a user