feat(service): add Opnform template (#5875)

This commit is contained in:
Andras Bacsai 2025-11-24 13:02:59 +01:00 committed by GitHub
commit be83c7ae08
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 229 additions and 0 deletions

1
public/svgs/opnform.svg Normal file
View file

@ -0,0 +1 @@
<svg fill="none" height="120" viewBox="0 0 120 120" width="120" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="a" gradientUnits="userSpaceOnUse" x1="60" x2="60" y1="2" y2="118.352"><stop offset="0" stop-color="#2563eb"/><stop offset="1" stop-color="#60a5fa"/></linearGradient><path clip-rule="evenodd" d="m80.6502 118.352c22.9638-8.418 39.3498-30.4712 39.3498-56.352 0-33.1371-26.8629-60-60-60s-60 26.8629-60 60c0 25.8808 16.3862 47.934 39.3498 56.352l16.631-38.9411c-7.4746-1.9924-12.9808-8.8086-12.9808-16.9109 0-9.665 7.835-17.5 17.5-17.5s17.5 7.835 17.5 17.5c0 8.4269-5.9563 15.4627-13.8885 17.1269z" fill="url(#a)" fill-rule="evenodd"/></svg>

After

Width:  |  Height:  |  Size: 698 B

View file

@ -0,0 +1,228 @@
# documentation: https://docs.opnform.com/introduction
# slogan: OpnForm is an open-source form builder that lets you create beautiful forms and share them anywhere. It's super fast, you don't need to know how to code
# tags: opnform, form, survey, cloud, open-source, self-hosted, docker, no-code, embeddable
# logo: svg/opnform.svg
# port: 80
x-shared-env: &shared-api-env
APP_NAME: "OpnForm"
APP_ENV: production
APP_KEY: ${SERVICE_BASE64_APIKEY}
APP_DEBUG: ${APP_DEBUG:-false}
APP_URL: ${SERVICE_URL_NGINX}
LOG_CHANNEL: errorlog
LOG_LEVEL: ${LOG_LEVEL:-debug}
FILESYSTEM_DRIVER: ${FILESYSTEM_DRIVER:-local}
LOCAL_FILESYSTEM_VISIBILITY: public
CACHE_DRIVER: redis
QUEUE_CONNECTION: redis
SESSION_DRIVER: redis
SESSION_LIFETIME: 120
MAIL_MAILER: ${MAIL_MAILER:-log}
MAIL_HOST: ${MAIL_HOST}
MAIL_PORT: ${MAIL_PORT}
MAIL_USERNAME: ${MAIL_USERNAME:-your@email.com}
MAIL_PASSWORD: ${MAIL_PASSWORD}
MAIL_ENCRYPTION: ${MAIL_ENCRYPTION}
MAIL_FROM_ADDRESS: ${MAIL_FROM_ADDRESS:-your@email.com}
MAIL_FROM_NAME: ${MAIL_FROM_NAME:-OpnForm}
AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
AWS_DEFAULT_REGION: ${AWS_DEFAULT_REGION:-us-east-1}
AWS_BUCKET: ${AWS_BUCKET}
OPEN_AI_API_KEY: ${OPEN_AI_API_KEY}
TELEGRAM_BOT_ID: ${TELEGRAM_BOT_ID}
TELEGRAM_BOT_TOKEN: ${TELEGRAM_BOT_TOKEN}
REDIS_HOST: redis
REDIS_PASSWORD: ${SERVICE_PASSWORD_64_REDIS}
# Database settings
DB_HOST: postgresql
DB_DATABASE: ${POSTGRESQL_DATABASE:-opnform}
DB_USERNAME: ${SERVICE_USER_POSTGRESQL}
DB_PASSWORD: ${SERVICE_PASSWORD_POSTGRESQL}
DB_CONNECTION: pgsql
# PHP Configuration
PHP_MEMORY_LIMIT: "1G"
PHP_MAX_EXECUTION_TIME: "600"
PHP_UPLOAD_MAX_FILESIZE: "64M"
PHP_POST_MAX_SIZE: "64M"
services:
opnform-api:
image: jhumanj/opnform-api:1.12.1
volumes:
- api-storage:/usr/share/nginx/html/storage
environment:
# Use the shared environment variables.
<<: *shared-api-env
JWT_TTL: ${JWT_TTL:-1440}
JWT_SECRET: ${SERVICE_PASSWORD_JWTSECRET}
JWT_SKIP_IP_UA_VALIDATION: ${JWT_SKIP_IP_UA_VALIDATION:-true}
H_CAPTCHA_SITE_KEY: ${H_CAPTCHA_SITE_KEY}
H_CAPTCHA_SECRET_KEY: ${H_CAPTCHA_SECRET_KEY}
RE_CAPTCHA_SITE_KEY: ${RE_CAPTCHA_SITE_KEY}
RE_CAPTCHA_SECRET_KEY: ${RE_CAPTCHA_SECRET_KEY}
SHOW_OFFICIAL_TEMPLATES: ${SHOW_OFFICIAL_TEMPLATES:-true}
depends_on:
postgresql:
condition: service_healthy
redis:
condition: service_healthy
healthcheck:
test: ["CMD-SHELL", "php /usr/share/nginx/html/artisan about || exit 1"]
interval: 30s
timeout: 15s
retries: 3
start_period: 60s
api-worker:
image: jhumanj/opnform-api:1.12.1
volumes:
- api-storage:/usr/share/nginx/html/storage
environment:
# Use the shared environment variables.
<<: *shared-api-env
command: ["php", "artisan", "queue:work"]
depends_on:
postgresql:
condition: service_healthy
redis:
condition: service_healthy
healthcheck:
test:
["CMD-SHELL", "pgrep -f 'php artisan queue:work' > /dev/null || exit 1"]
interval: 60s
timeout: 10s
retries: 3
start_period: 30s
api-scheduler:
image: jhumanj/opnform-api:1.12.1
volumes:
- api-storage:/usr/share/nginx/html/storage
environment:
# Use the shared environment variables.
<<: *shared-api-env
command: ["php", "artisan", "schedule:work"]
depends_on:
postgresql:
condition: service_healthy
redis:
condition: service_healthy
healthcheck:
test:
[
"CMD-SHELL",
"php /usr/share/nginx/html/artisan app:scheduler-status --mode=check --max-minutes=3 || exit 1",
]
interval: 60s
timeout: 30s
retries: 3
start_period: 70s # Allow time for first scheduled run and cache write
opnform-ui:
image: jhumanj/opnform-client:1.12.1
environment:
- NUXT_PUBLIC_APP_URL=/
- NUXT_PUBLIC_API_BASE=/api
- NUXT_PRIVATE_API_BASE=http://nginx/api
- NUXT_PUBLIC_ENV=production
- NUXT_PUBLIC_H_CAPTCHA_SITE_KEY=${H_CAPTCHA_SITE_KEY}
- NUXT_PUBLIC_RE_CAPTCHA_SITE_KEY=${RE_CAPTCHA_SITE_KEY}
healthcheck:
test:
["CMD-SHELL", "wget --spider -q http://opnform-ui:3000/login || exit 1"]
interval: 30s
timeout: 10s
retries: 3
start_period: 45s
depends_on:
opnform-api:
condition: service_healthy
postgresql:
image: postgres:16
volumes:
- opnform-postgresql-data:/var/lib/postgresql/data
environment:
- POSTGRES_USER=${SERVICE_USER_POSTGRESQL}
- POSTGRES_PASSWORD=${SERVICE_PASSWORD_POSTGRESQL}
- POSTGRES_DB=${POSTGRESQL_DATABASE:-opnform}
healthcheck:
test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
interval: 5s
timeout: 20s
retries: 10
redis:
image: redis:7
environment:
- REDIS_PASSWORD=${SERVICE_PASSWORD_64_REDIS}
volumes:
- redis-data:/data
command: ["redis-server", "--requirepass", "${SERVICE_PASSWORD_64_REDIS}"]
healthcheck:
test: ["CMD", "redis-cli", "-a", "${SERVICE_PASSWORD_64_REDIS}", "PING"]
interval: 10s
timeout: 30s
retries: 3
# The nginx reverse proxy.
# used for reverse proxying the API service and Web service.
nginx:
image: nginx:1.29.2
environment:
- SERVICE_URL_NGINX
volumes:
- type: bind
source: ./nginx/nginx.conf
target: /etc/nginx/conf.d/default.conf
read_only: true
content: |
map $original_uri $api_uri {
~^/api(/.*$) $1;
default $original_uri;
}
server {
listen 80 default_server;
root /usr/share/nginx/html/public;
access_log /dev/stdout;
error_log /dev/stderr error;
index index.html index.htm index.php;
location / {
proxy_http_version 1.1;
proxy_pass http://opnform-ui:3000;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
location ~/(api|open|local\/temp|forms\/assets)/ {
set $original_uri $uri;
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass opnform-api:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html/public/index.php;
fastcgi_param REQUEST_URI $api_uri;
}
}
depends_on:
- opnform-api
- opnform-ui
healthcheck:
test: ["CMD", "nginx", "-t"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s