Analytics cookies only (Google Analytics, PostHog). No ad networks, no cross-site tracking. See our privacy policy.
A full survey platform: 30+ question types, skip logic and question branching, multilingual surveys, closed-access mode with personal invitation links, response statistics, plugins and a RemoteControl API. GPL-2.0-or-later PHP that needs MySQL/MariaDB or PostgreSQL; upstream ships no container image, so the snippet runs the community-maintained martialblog/limesurvey image (Apache + PHP) next to MariaDB.
Runs on a VPS from $6/mo (Kamatera 2GB, 2 GB RAM) · prices checked Sep 2026
Pick LimeSurvey when the job is a real survey rather than a contact form: 30+ question types, skip logic and branching, multilingual surveys, closed-access mode with personal invitation links, response statistics, plugins and a RemoteControl API, with two-factor authentication and SAML or LDAP integrations when a research group or HR department needs them. It is GPL-2.0-or-later PHP (Yii) on MariaDB, MySQL or PostgreSQL. LimeSurvey publishes no container image and its manual documents only a manual web-server install, so our snippet runs the community-maintained `martialblog/limesurvey` image next to MariaDB, based on that repo's compose examples with a pinned image and generated passwords; the image's entrypoint writes `config.php` and runs the command-line installer on first boot. The manual's requirements page gives disk, PHP and database versions but no RAM figure, so our 1 GB floor is an estimate. Compared with the catalog's Formbricks and HeyForm, which are lighter form and survey builders, LimeSurvey is the heavyweight: the one to choose when you need quotas of question types, token-based participation and statistics in the product itself.
Paid link — we earn a commission if you shop through it.
Run these commands on your server:
# LimeSurvey — survey platform in the community-maintained martialblog/limesurvey image (LimeSurvey itself publishes no container image) + MariaDB — based on docker-compose.yml and docker-compose.example.yml in github.com/martialblog/docker-limesurvey, pinned to 7.5.1-261007-apache (LimeSurvey 7.5.1+261007)
echo "DB_PASSWORD=$(openssl rand -hex 16)" > .env
echo "DB_ROOT_PASSWORD=$(openssl rand -hex 16)" >> .env
echo "ADMIN_PASSWORD=$(openssl rand -hex 12)" >> .env
cat > docker-compose.yml <<'EOF'
services:
limesurvey:
image: martialblog/limesurvey:7.5.1-261007-apache
restart: unless-stopped
environment:
DB_TYPE: mysql
DB_HOST: db
DB_PORT: "3306"
DB_NAME: limesurvey
DB_USERNAME: limesurvey
DB_PASSWORD: ${DB_PASSWORD}
ADMIN_USER: admin
ADMIN_NAME: Admin
ADMIN_EMAIL: admin@example.com
ADMIN_PASSWORD: ${ADMIN_PASSWORD}
PUBLIC_URL: http://SERVER_IP:8080
volumes:
- limesurvey_upload:/var/www/html/upload
ports:
- 8080:8080
depends_on:
- db
db:
image: mariadb:11.4.13
restart: unless-stopped
environment:
MARIADB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
MARIADB_DATABASE: limesurvey
MARIADB_USER: limesurvey
MARIADB_PASSWORD: ${DB_PASSWORD}
volumes:
- db_data:/var/lib/mysql
volumes:
limesurvey_upload:
db_data:
EOF
docker compose up -d
timeout 300 bash -c 'until curl -fsS http://localhost:8080/ >/dev/null; do sleep 5; done'
# → http://SERVER_IP:8080 — admin panel at /index.php/admin, user admin with the ADMIN_PASSWORD from .env; the entrypoint installs the database on first boot before Apache startsThe docker-limesurvey README and entrypoint flag these before you invite participants: