Pleasanter
Overview
Pleasanter (Implem.Pleasanter) is an open-source no-code and low-code business database platform, a self-hosted alternative to tools such as Airtable and kintone. In the browser, with no programming, you build your own tables (Pleasanter calls them sites), records, views, dashboards and approval workflows. A full REST API lets other systems drive everything.
This SecureAnyCloud image runs Pleasanter as a ready-to-use appliance. The ASP.NET Core application runs under Kestrel bound to loopback, a local PostgreSQL database stores the data, and nginx in front is the single public entry point. The Pleasanter login page is the authenticated front door.
Read this before you expose the VM. The application is bound to 127.0.0.1:5000 and cannot be reached directly from the network. nginx on port 80 is the only public listener. Neither the application nor nginx starts until the first boot has built the per-VM database and rotated the Administrator password. Pleasanter is therefore never reachable with a default credential, and the upstream default login (Administrator / pleasanter) is rejected on every deployed VM.
What you get:
- Pleasanter 1.5.6.1 (the latest upstream release), unmodified, under the AGPL-3.0 licence. It is a single, fully featured edition with no licence key and no paywalled tier.
- The ASP.NET Core Runtime 10.0, installed from the Ubuntu 24.04 archive (
main) and never frompackages.microsoft.com - A local PostgreSQL 16 backing store, initialised on first boot with a per-VM schema and per-VM database passwords
- A per-VM Administrator password and a per-VM API key, generated on first boot and recorded in a root-only file
- The application bound to
127.0.0.1:5000only, with a dedicatedpleasanterservice account (NoNewPrivileges,ProtectSystem,ProtectHome) - nginx on port 80 as the only public listener, held closed until first boot completes
- 24/7 SecureAnyCloud support
Pleasanter is a trademark of Implem Inc. SecureAnyCloud is an independent packager and is not affiliated with, endorsed by, or sponsored by Implem Inc.
Prerequisites
You need the following:
- An active Azure subscription
- An SSH key pair
- A virtual network and subnet in the target region
- A VM size of Standard_B2s (2 vCPU / 4 GiB RAM) as a starting point. The whole stack (the .NET application, PostgreSQL and nginx) uses well under half of that.
- Network security group inbound rules that allow
22/tcpfrom your management network and80/tcpfor the application
The image serves plain HTTP on port 80. To serve it over HTTPS, terminate TLS in front of it with your own domain.
Step 1 - Deploy from the Azure Marketplace
Sign in to the Azure portal, choose Create a resource, search the Marketplace for Pleasanter, and select Create.
On the Basics tab, pick your subscription, resource group, region and size. Under Administrator account, choose SSH public key and paste your key. Under Inbound port rules, allow SSH (22) and HTTP (80). Then choose Review + create and Create.
Step 2 - Deploy from the Azure CLI
Accept the Marketplace terms, create the VM, open the required ports and read back the public IP address:
az vm image terms accept --urn sac1647283583153:pleasanter:default:latest
az vm create \
--resource-group my-rg \
--name pleasanter \
--image sac1647283583153:pleasanter:default:latest \
--size Standard_B2s \
--admin-username azureuser \
--generate-ssh-keys \
--public-ip-sku Standard
# open the required ports, then read back the public IP
az vm open-port --resource-group my-rg --name pleasanter --port 22 --priority 1001
az vm open-port --resource-group my-rg --name pleasanter --port 80 --priority 1002
az vm list-ip-addresses --resource-group my-rg --name pleasanter \
--query "[0].virtualMachine.network.publicIpAddresses[0].ipAddress" -o tsvStep 3 - Retrieve the per-VM credentials
First boot generates a unique Administrator password, a unique API key and unique database passwords. It writes them to a root-only file. Connect over SSH and read the file:
sudo cat /root/pleasanter-credentials.txtThe file is 0600 root:root. Both the application and nginx wait for a bootstrap-ready marker, which first boot creates only after it has built the database and rotated the Administrator password.
Step 4 - Verify the deployment
Confirm that the three services are active, that Kestrel is bound to loopback only, and that nginx faces the network:
systemctl is-active postgresql pleasanter nginx ss -ltnp | grep -E ':(80|5000)' curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1/http://127.0.0.1/ returns 302, because Pleasanter redirects an unauthenticated request to its login page. Port 5000 answers only on 127.0.0.1 and is refused on the routable address of the VM, so the application is reachable only through nginx.
Step 5 - Log in to Pleasanter
Open http://<your-vm-ip>/ in a browser. The Pleasanter login page opens. Sign in with the login ID Administrator and the password from /root/pleasanter-credentials.txt.
After you sign in, the top page opens. Your tables (sites) appear as tiles alongside the built-in start guide.
Step 6 - Build a table and add records (no code)
This is what Pleasanter is for. On the top page, use the + button to create a new table. Choose a Records (Results) table, give it a title such as Team Tasks, and save. You now have a working database table, built without code. It has columns for status, manager, owner and update times, and it supports filtering, aggregation and CSV import and export.
Click any row to open the record editor. There you edit the title and body, set a status, owner and manager, attach files, add comments and keep a full change history.
Step 7 - Drive it from the REST API
Every table that Pleasanter builds is immediately available over a REST API, authenticated with the per-VM API key from /root/pleasanter-credentials.txt. The example below creates a table, adds a record and reads it straight back. Replace <API_KEY> with the real key from the credentials file:
API_KEY='<API_KEY>' BASE=http://localhost
SITE=$(curl -s -H 'Content-Type: application/json' \
-d "{\"ApiVersion\":1.1,\"ApiKey\":\"$API_KEY\",\"Title\":\"API Demo\",\"ReferenceType\":\"Results\",\"SiteSettings\":{}}" \
"$BASE/api/items/0/createsite")
SITE_ID=$(echo "$SITE" | sed -n 's/.*"Id":\([0-9]*\).*/\1/p' | head -1)
REC=$(curl -s -H 'Content-Type: application/json' \
-d "{\"ApiVersion\":1.1,\"ApiKey\":\"$API_KEY\",\"Title\":\"Ship the release\"}" \
"$BASE/api/items/$SITE_ID/create")
REC_ID=$(echo "$REC" | sed -n 's/.*"Id":\([0-9]*\).*/\1/p' | head -1)
curl -s -H 'Content-Type: application/json' \
-d "{\"ApiVersion\":1.1,\"ApiKey\":\"$API_KEY\"}" \
"$BASE/api/items/$REC_ID/get"Each call returns a 200 status, and the read-back returns the record with its title intact. This proves the write path, the schema and API authentication in one loop.
You can create additional API keys per user under each user's API Settings in the Pleasanter UI.
Step 8 - Confirm the security posture
The image ships with no usable credential and no database. First boot creates everything:
- The upstream default login
Administrator/pleasanteris rejected. First boot rotates the Administrator password to a per-VM secret before the public listener ever opens. - Pleasanter stores passwords as SHA-512 hashes, and the credentials file is
0600 root:root. - PostgreSQL listens on loopback only, with a per-VM
postgrespassword and dedicated per-VM owner and user roles. - Both
pleasanter.serviceandnginx.servicecarryConditionPathExists=/var/lib/sac/data/pleasanter-bootstrap-ready. If first boot fails, the public listener never opens (fail closed).
Step 9 - Check the runtime and licensing
List the installed .NET runtimes and the pinned versions file:
dotnet --list-runtimes cat /opt/sac/pleasanter-versions.txtThe ASP.NET Core Runtime 10.0 comes from the Ubuntu archive (noble-updates/main and noble-security/main), so it receives security updates through the normal apt channel. Pleasanter itself is pinned to release 1.5.6.1.
Step 10 - Change the Administrator password
Sign in to Pleasanter, open the Administrator account from the user menu, and choose Change password. To rotate the password from the command line, update the SHA-512 hash directly. Pleasanter hashes passwords as unsalted lowercase-hex SHA-512.
NEWPASS='<new-password>'
HASH=$(printf '%s' "$NEWPASS" | sha512sum | awk '{print $1}')
sudo -u postgres psql -d "Implem.Pleasanter" \
-c "UPDATE \"Implem.Pleasanter\".\"Users\" SET \"Password\"='$HASH' WHERE \"LoginId\"='Administrator';"Maintenance
Back up the database. All your tables and records live in the local PostgreSQL database Implem.Pleasanter. Dump it with:
sudo -u postgres pg_dump -Fc "Implem.Pleasanter" > pleasanter-backup.dumpOperating system updates arrive through Ubuntu unattended upgrades, which stay enabled on the image. Reboot when a new kernel is installed. Before you expose the VM to untrusted networks, put it behind your own TLS termination and network security group rules.
Support
SecureAnyCloud provides 24/7 support for every image. If you have questions about this deployment, contact the SecureAnyCloud team through the Azure Marketplace listing.
Deploy on Azure
Launch Pleasanter on Ubuntu 24.04 LTS on Azure with 24/7 support from SecureAnyCloud.
View this image
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com