开源表单生成器OpnForm

什么是 OpnForm ?
OpnForm是一个开源的表单构建工具,旨在简化创建自定义表单的过程,特别适合无编码知识的用户。它通过人工智能优化表单创建流程,支持多种用途,如联系人表单、调查表等。OpnForm提供了一个直观的拖放界面,用户可以快速创建美观的表单,并且只需不到一分钟的时间即可完成。
软件功能:
- 🚀 无代码构建器,支持无限的表单和提交
- 📝 各种输入类型:文本、日期、URL、文件上传等等
- 🌐 可嵌入到任何地方
- 📧 电子邮件通知
- 💬 集成(
Slack、Webhooks、Discord) - 🧠 表单逻辑和自定义
- 🛡️ 验证码保护
- 📊 表单分析

安装
在群晖上以 Docker 方式安装。
本文写作时,主镜像
jhumanj/opnform-api的latest版本对应为1.3.7;

软件涉及到多个容器,采用了 docker-compose 方式安装,但没有用官方提供的的脚本安装方式,因为老苏不想下载源码,所以对目录、文件等做了调整
如果你想使用官方的方式,可以参考官方的文档:https://docs.opnform.com/deployment/docker
下面是介绍的是老苏的纯手工安装方式
nginx.conf
nginx.conf 为 nginx 的配置文件,直接采用官方提供的版本,未做任何修改,源文件地址在:https://github.com/JhumanJ/OpnForm/blob/main/docker/nginx.conf
map $original_uri $api_uri {~^/api(/.*$) $1;default $original_uri;
}server {listen 80;server_name opnform;root /app/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://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 api:9000;fastcgi_index index.php;include fastcgi_params;#fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html/$fastcgi_script_name;fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html/public/index.php;fastcgi_param REQUEST_URI $api_uri;}
}
api-env.txt
api-env.txt 为服务端的环境变量文件
APP_NAME="OpnForm"
APP_ENV=production
APP_KEY=base64:G4UgDosWwGfxUa4YrcvPlzq1DicnSqtW9y5igi4nFX4=
APP_DEBUG=false
APP_URL=http://192.168.0.197:8320SELF_HOSTED=trueLOG_CHANNEL=errorlog
LOG_LEVEL=debugFILESYSTEM_DRIVER=localBROADCAST_CONNECTION=logCACHE_STORE=redis
CACHE_DRIVER=redisQUEUE_CONNECTION=redis
SESSION_DRIVER=redis
SESSION_LIFETIME=120MAIL_MAILER=log
MAIL_HOST=
MAIL_PORT=
MAIL_USERNAME=your@email.com
MAIL_PASSWORD=
MAIL_ENCRYPTION=
MAIL_FROM_ADDRESS=your@email.com
MAIL_FROM_NAME=OpnFormAWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_APP_CLUSTER=mt1MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"JWT_TTL=1440
JWT_SECRET=hS2Z7AOJYhZnq4vIQ32tsWQ4SxSYfj5f2jKfCLcWxz0=MUX_WORKSPACE_ID=
MUX_API_TOKEN=OPEN_AI_API_KEY=
基于官方的 .env.docker 做了几处修改,源文件在:https://github.com/JhumanJ/OpnForm/blob/main/api/.env.docker
APP_ENV:从local改为了production;APP_KEY:使用openssl rand -base64 32生成

但是需要加上前缀 base64:,否则日志会报错
NOTICE: PHP message: [2024-10-15 11:28:25] production.ERROR: Unsupported cipher or incorrect key length. Supported ciphers are: aes-128-cbc, aes-256-cbc, aes-128-gcm, aes-256-gcm. {"exception":"[object] (RuntimeException(code: 0): Unsupported cipher or incorrect key length. Supported ciphers are: aes-128-cbc, aes-256-cbc, aes-128-gcm, aes-256-gcm. at /usr/share/nginx/html/vendor/laravel/framework/src/Illuminate/Encryption/Encrypter.php:62)
APP_URL:需要根据实际情况进行修改,其中192.168.0.197为群晖主机的IP,而8320是准备分配给OpnForm的本机端口;JWT_SECRET:使用openssl rand -base64 32生成;
其他参数未做修改,包括 OpenAI、邮件、AWS 存储和 PUSHER 提醒等,如果你有需要可以自习修改,官方提供了环境变量的说明:https://docs.opnform.com/configuration/environment-variables
client-env.txt
client-env.txt 是前端页面的环境变量文件
NUXT_PUBLIC_APP_URL=/
NUXT_PUBLIC_API_BASE=/api
NUXT_PRIVATE_API_BASE=http://ingress/api
NUXT_PUBLIC_ENV=dev
FRONT_API_SECRET=AYSG0uDT2euWdFjsLR/bUWvwTufmnQLyJJMpuBoyYao=
基于官方的 .env.docker 做了一处新增,源文件在:https://github.com/JhumanJ/OpnForm/blob/main/client/.env.docker
FRONT_API_SECRET:也是使用openssl rand -base64 32生成;
docker-compose.yml
将下面的内容保存为 docker-compose.yml 文件
官方的源文件:https://github.com/JhumanJ/OpnForm/blob/main/docker-compose.yml
老苏做了微调,因为参数比较多,保留了官方的锚点,使得容器 opnform-api-worker 可以复用 opnform-api 的环境变量参数
version: '3'services:api: &apiimage: jhumanj/opnform-api:latestcontainer_name: opnform-apienvironment: &api-environment # Add this anchorDB_HOST: dbREDIS_HOST: redisDB_DATABASE: ${DB_DATABASE:-forge}DB_USERNAME: ${DB_USERNAME:-forge}DB_PASSWORD: ${DB_PASSWORD:-forge}DB_CONNECTION: ${DB_CONNECTION:-pgsql}FILESYSTEM_DISK: localLOCAL_FILESYSTEM_VISIBILITY: publicenv_file: - ./api-env.txtvolumes:- ./storage:/usr/share/nginx/html/storage:rwapi-worker:image: jhumanj/opnform-api:latestcontainer_name: opnform-api-workercommand: php artisan queue:workenvironment:<<: *api-environmentIS_API_WORKER: "true"env_file: - ./api-env.txtvolumes:- ./storage:/usr/share/nginx/html/storage:rwui:image: jhumanj/opnform-client:latestcontainer_name: opnform-uienv_file: - ./client-env.txtredis:image: redis:7container_name: opnform-redisdb:image: postgres:16container_name: opnform-db# ports:# - 5433:5432environment:POSTGRES_DB: ${DB_DATABASE:-forge}POSTGRES_USER: ${DB_USERNAME:-forge}POSTGRES_PASSWORD: ${DB_PASSWORD:-forge}volumes:- ./data:/var/lib/postgresql/dataingress:image: nginx:1container_name: opnform-ingressvolumes:- ./nginx.conf:/etc/nginx/templates/default.conf.templateports:- 8320:80
这部分理论上只要修改 opnform-ingress 中的本机端口,使之不产生冲突就可以
然后执行下面的命令
# 新建文件夹 opnform 和 子目录
mkdir -p /volume1/docker/opnform/{data,storage}# 进入 opnform 目录
cd /volume1/docker/opnform# 将 docker-compose.yml 放入当前目录# 一键启动
docker-compose up -d

注意事项
一键启动过程中或者之后,可能会遇到一些问题,老苏把自己遇到的放在这里,供大家参考
超时问题
因为容器比较多,可能在一键启动过程中会出现超时

可以先执行
# 将超时时间设置为 5 分钟
export COMPOSE_HTTP_TIMEOUT=300

容器停止
可能会遇到某个容器停止

可以尝试强制启动

登录无反应
假如一键启动后,使用默认的账号密码登录没有反应,很可能是数据库没有 migrate 成功,导致创建默认凭据失败

可以单独再执行一次
# 进入容器
docker exec --user root -it opnform-api /bin/bash# 迁移数据
php artisan migrate:refresh --seed
或者只用一条命令来解决
# 迁移数据
docker-compose exec api php artisan migrate:refresh --seed

接下来创建默认凭据就可以了
# 创建默认用户
docker-compose exec api php artisan app:init-project

运行
在浏览器中输入 http://群晖IP:8320 就能看到主界面

点左上角的 Login 进入登录界面

默认凭据,可以在 opnform-api 的日志中找到
- 电子邮件:
admin@opnform.com - 密码:
password
- 自托管版本禁止公开注册。请使用管理员帐户邀请其他用户
- 如果登录没反应,请参考上一个章节

首次登录后,系统将提示您更改电子邮件和密码

设置完成后,会回到登录界面,需要用新账号重新登录,登录成功后的主界面

新建 form

可以从一个简单的联系人表开始,也可以选择从模版导入

模版挺多的

进入模版有说明和预览,点右上角的 Use this template 进行选择

选择后可以进入到编辑模式

你可以根据需要进行修改,也可以直接发布

做了简单的修改,将英文改成了中文

点右上角的 Publish Form 发布

在其他机器上打开链接

手机上扫描二维码

参考文档
JhumanJ/OpnForm: Beautiful Open-Source Form Builder
地址:https://github.com/JhumanJ/OpnForm
Beautiful forms & Surveys - OpnForm
地址:https://opnform.com/
Docker - OpnForm Technical Docs
地址:https://docs.opnform.com/deployment/docker
My open-source form builder just reached 2k stars on Github! : r/selfhosted
地址:https://www.reddit.com/r/selfhosted/comments/1g3ego7/my_opensource_form_builder_just_reached_2k_stars/
相关文章:
开源表单生成器OpnForm
什么是 OpnForm ? OpnForm 是一个开源的表单构建工具,旨在简化创建自定义表单的过程,特别适合无编码知识的用户。它通过人工智能优化表单创建流程,支持多种用途,如联系人表单、调查表等。OpnForm 提供了一个直观的拖放…...
Zookeeper面试整理-Zookeeper的基础概念
Zookeeper的基础概念是理解其作为分布式协调服务的核心要素。以下是一些关键的基础概念: 1. Zookeeper是什么? Zookeeper 是一个开源的分布式协调服务,用于分布式应用中的配置管理、命名服务、分布式锁、集群管理等任务。它提供了一组简单的原语,帮助开发人员构建健壮的分布…...
验证archive_command配置是否正确
要验证 archive_command 配置是否正确,你可以按照以下步骤进行: 检查配置文件: 确保 postgresql.conf(或你的 PostgreSQL 实例使用的任何自定义配置文件)中的 archive_command 已经设置为你想要的命令。 重启 …...
2024.10.19小米笔试题解
第一题数独计数 考虑dfs遍历所有情况 n = int(input())def check(grid, x, y, v):dx = [1, 0, -1, 0]dy = [0, 1, 0, -1]for i in range(4):nx, ny = x + dx[i], y + dy[i]if 0 <= nx < 3 and 0 <= ny < 3:if grid[nx][ny] == 0:continueif abs(grid[nx][ny] - v…...
SQL-SERVER导入excel表格
首先先找到数据源,如上图。我们用的是excel表格。 这里你需要选择excel版本,反正你随便选,应该没什么问题的。 再导入数据 我们需要导入最后那个,也就是OLE DB Provider for SQL SERVER 只有这个才能导入到当前的数据库中 接下来…...
Vue学习笔记(三、v-cloak、v-text、v-html指令)
一、 v-cloak v-cloak 是 Vue.js 提供的一个特殊指令,用于在 Vue 实例准备完毕并开始进行 DOM 编译之前隐藏未编译的模板。它通常用于防止页面闪烁或者展示未编译的 Vue 模板语法。 你可以简单地在 HTML 元素上添加 v-cloak 指令,然后在确保 Vue…...
Java | Leetcode Java题解之第496题下一个更大元素I
题目: 题解: class Solution {public int[] nextGreaterElement(int[] nums1, int[] nums2) {Map<Integer, Integer> map new HashMap<Integer, Integer>();Deque<Integer> stack new ArrayDeque<Integer>();for (int i num…...
【ArcGIS微课1000例】0125:ArcGIS矢量化无法自动完成面解决方案
文章目录 一、坐标系统问题二、正确使用自动完成面工具一、坐标系统问题 1. 数据库坐标系 arcgis矢量化的过程中,无法自动完成面,可能是因为图层要素没有坐标系造成的。双击数据库打开数据库属性,可以查看当前数据框的坐标系。 2. 图层坐标系 双击图层,打开图层属性,切…...
slam技术支持下的果园作物估产论文汇总
文章目录 2019ROLS : Robust Object-level SLAM for grape counting(CVPR) 2021PATHoBot: A Robot for Glasshouse Crop Phenotyping and Intervention 2023ORB-Livox: A real-time dynamic system for fruit detection and localization(Com…...
政安晨【零基础玩转各类开源AI项目】基于本地Ubuntu (Linux ) 系统应用Gradio-Lite:无服务器 Gradio 完全在浏览器中运行
目录 简介 什么是@gradio/lite? 入门 1.导入 JS 和 CSS 2. 创建标签 3. 在标签内编写你的 Gradio 应用程序 更多示例:添加其他文件和要求 多个文件 其他要求 SharedWorker 模式 代码和演示playground 1.无服务器部署 2.低延迟 3. 隐私和安全 限制 尝试一下!…...
Spring 中的 @AUtowire 和 @Resource 用法和原理,以及避坑
🌟 Why:了解 Autowire 和 Resource 的高级用法和原理对于开发大型企业级应用至关重要。这些注解不仅帮助我们实现组件之间的松耦合,还能提高代码的可维护性和可测试性。掌握它们的高级用法可以让我们更灵活地处理复杂的依赖关系。 …...
速盾:cdn能加速游戏吗?
CDN(内容分发网络)是一种通过分布在全球不同地区的服务器来缓存和传输网络内容的技术。它的主要目的是提高内容的传输速度和用户体验。虽然CDN主要用于加速网站的访问和内容传输,但它也可以应用于游戏加速。 在传统的在线游戏中,…...
速盾:高防服务器防火墙的特性是什么?
高防服务器防火墙是一种专业的网络安全设备,用于保护服务器免受各种网络攻击的侵害。它具有许多特性,以确保服务器的安全性和可靠性。 第一个特性是入侵检测系统(IDS)。高防服务器防火墙可以监视服务器上的网络流量,并…...
初识git · 远程操作
目录 前言: 理解分布式版本控制系统 远程仓库 仓库操作 克隆仓库 推送和抓取 特殊文件 取别名 标签管理 前言: 在基本操作,分支管理这几个部分,我们都会在本地仓库操作了,但是目前还没有办法将自己的代码远程…...
深度学习:卷积神经网络(CNN)详解
卷积神经网络(CNN)详解 卷积神经网络(Convolutional Neural Network, CNN)是一种专为处理具有网格结构数据(如图像)的深度学习模型。CNN通过引入卷积层、池化层等独特的操作,能够有效提取局部特…...
软件测试学习笔记丨Pycharm实用技巧
本文转自测试人社区,原文链接:https://ceshiren.com/t/topic/23459 PyCharm 应该是大多数 python 开发者的首选 IDE,每天我们都在上面敲着熟悉的代码,写出一个又一个奇妙的功能。它是帮助用户在使用 Python 语言开发时提高其效率的…...
Vue学习笔记(二、Vue.js的引入与对象创建)
一、引入vue 1.通过cdn引入: <script src"https://cdn.jsdelivr.net/npm/vue2/dist/vue.js"></script> 2.本地引入: <script src"./lib/vue.js"></script> 二、创建Vue对象 代码参考如下: …...
从0-1搭建金融智能助理保姆级教程:拆箱即用的微信公众号后端+AI Agents智能体框架
大模型LLM 应用AI Agents框架,为我们提供了非常便利的自动化执行任务的能力。微信公众号(订阅号) 是非常适合落地各种AI Agents的场景,我们可以利用微信公众号提供的文本、图像、语音的输入,在自己服务器上部署一套API框架,把自己…...
Yolov10训练的餐盘菜品目标检测软件(包含源码及数据集)
本文摘要 摘要:本文主要使用YOLOV10深度学习框架自训练了一个“餐盘菜品目标检测模型”,基于此模型使用PYQT5实现了一款界面软件用于功能演示。让您可以更好的了解和学习,该软件支持图片、视频以及摄像头进行目标检测,本系统所涉…...
Active Directory(活动目录)密码审核工具
什么是Active Directory密码审核 Active Directory密码审核涉及监控用户密码的状态及其身份验证尝试,以便 IT 管理员收到有关弱 Active Directory密码或任何异常身份验证行为的通知。 Active Directory密码审核可帮助管理员评估用户密码的强度并采取必要措施来加强…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
