8 Commits

Author SHA1 Message Date
9f300a65ff case 4727 - setup script: listen on 127.0.0.1 only, read-only program folder, systemd sandboxing
nginx is the only way in, so AyaNova listens on 127.0.0.1:7575 instead of all
interfaces. The service account (www-data, which nginx also runs as) no longer
has write access to the program folder, only to data. The unit gets
NoNewPrivileges, ProtectSystem=strict with ReadWritePaths=/var/ayanova/data,
PrivateTmp and ProtectHome.

Tested on devtestn10 (Ubuntu 24.04.5) with the 8.3.0 build: report render
including the first browser download, backup, attachment upload, download and
delete; nothing blocked.

Do not deploy a client built from this before 8.3.0 is released: the script
installs the released zip.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 13:59:53 -07:00
cb8d6da832 version bumps 2026-10-25 08:07:10 -07:00
64d8f62e5e case 4690 - setup script: Ubuntu 26.04 support, unique secrets per server, no phased updates
- PostgreSQL from the PostgreSQL project's repository via postgresql-common's
  apt.postgresql.org.sh (apt-key is gone on newer Ubuntu)
- libgdk-pixbuf2.0-0 renamed libgdk-pixbuf-2.0-0 (needed on 26.04, also valid on 24.04)
- random PostgreSQL password and JWT secret per server, written to PostgreSQL and
  config.json (replacing the shipped defaults) and to /root/ayanova-secrets.txt (600)
- config.json 640 root:www-data
- APT::Get::Never-Include-Phased-Updates, as set by hand on every server today

Tested end to end on a fresh Ubuntu 26.04.1 droplet with the 8.3.0 build.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 09:31:39 -07:00
a48b82f6ec case 4690 - subscription server setup script: .NET 10 runtime; no Chrome folders beside the app
AyaNova 8.3.0 runs on .NET 10 and downloads the report browser under the
data folder. Do not deploy a client built from this before 8.3.0 is released:
the script installs the released zip, and 8.2.4 needs .NET 8.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 09:10:36 -07:00
683afce49b case 4682 2026-10-20 12:38:52 -07:00
97f5b37e0a Missing bit to support Atlanta datacenter in request for trial hosted subscription 2026-10-09 16:44:50 -07:00
35dfd669d9 case 4670 update version properly 2026-10-09 13:19:40 -07:00
259a2ee832 Merge net10-port: .NET 10 port 2026-10-09 12:52:44 -07:00
4 changed files with 35 additions and 16 deletions

View File

@@ -1,6 +1,6 @@
{ {
"name": "sockeye", "name": "sockeye",
"version": "8.1.0", "version": "8.1.1",
"private": true, "private": true,
"scripts": { "scripts": {
"serve": "vue-cli-service serve", "serve": "vue-cli-service serve",

View File

@@ -1,4 +1,4 @@
export default { export default {
version: "8.0.17", version: "8.1.1",
copyright: "© 1999-2024, Ground Zero Tech-Works Inc." copyright: "© 2026, Ground Zero Tech-Works Inc."
}; };

View File

@@ -142,7 +142,7 @@ export default {
); );
}, },
updateTimeValue(v) { updateTimeValue(v) {
this.updateValue(this.dateValue, v); this.updateValue(null, v);
}, },
updateValue(theDate, theTime) { updateValue(theDate, theTime) {
const vm = this; const vm = this;

View File

@@ -394,6 +394,7 @@ export default {
serverStates: [], serverStates: [],
dataCenters: [ dataCenters: [
{ id: "SF", name: "San Francisco" }, { id: "SF", name: "San Francisco" },
{ id: "ATL", name: "Atlanta" },
{ id: "NY", name: "New York" }, { id: "NY", name: "New York" },
{ id: "TOR", name: "Toronto" }, { id: "TOR", name: "Toronto" },
{ id: "AMS", name: "Amsterdam" }, { id: "AMS", name: "Amsterdam" },
@@ -1361,6 +1362,8 @@ DOMAINNAME='${m.vm.obj.name}'
############################# #############################
echo STARTING... echo STARTING...
timedatectl set-timezone $TIMEZONE timedatectl set-timezone $TIMEZONE
# no phased updates, so weekly updates match what was tested on devtest first
echo 'APT::Get::Never-Include-Phased-Updates "true";' > /etc/apt/apt.conf.d/52no-phasing
apt-get update apt-get update
apt-get dist-upgrade -y apt-get dist-upgrade -y
dpkg-reconfigure unattended-upgrades dpkg-reconfigure unattended-upgrades
@@ -1373,18 +1376,25 @@ echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf
echo 'vm.vfs_cache_pressure=50' | sudo tee -a /etc/sysctl.conf echo 'vm.vfs_cache_pressure=50' | sudo tee -a /etc/sysctl.conf
echo INSTALL .NET CORE echo INSTALL .NET CORE
apt-get install -y aspnetcore-runtime-8.0 apt-get install -y aspnetcore-runtime-10.0
echo GENERATE SERVER SECRETS
# unique per server, letters and digits only so they are safe in SQL, JSON and the connection string
DBPASSWORD=$(openssl rand -hex 24)
JWTSECRET=$(openssl rand -hex 16)
echo "PostgreSQL postgres password: $DBPASSWORD" > /root/ayanova-secrets.txt
echo "AYANOVA_JWT_SECRET: $JWTSECRET" >> /root/ayanova-secrets.txt
chmod 600 /root/ayanova-secrets.txt
echo INSTALL POSTGRESQL echo INSTALL POSTGRESQL
sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' # PostgreSQL project repository (same PostgreSQL build on every Ubuntu release); apt-key no longer exists on newer Ubuntu
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - apt-get install -y postgresql-common
sudo apt-get update /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh -y
sudo apt-get -y install postgresql sudo apt-get -y install postgresql
sudo -u postgres psql -U postgres -d postgres -c "alter user postgres with password 'YOUR_PASSWORD_HERE';" sudo -u postgres psql -U postgres -d postgres -c "alter user postgres with password '$DBPASSWORD';"
echo INSTALL REPORTING LIBS echo INSTALL REPORTING LIBS
# Ubuntu 24.04 # Ubuntu 24.04 and 26.04
sudo apt-get update sudo apt-get update
sudo apt-get install -y libatk1.0-0t64 libc6 libcairo2 libdbus-1-3 libexpat1 libfontconfig1 libgcc-s1 libgdk-pixbuf2.0-0 libglib2.0-0t64 libgtk-3-0t64 libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 ca-certificates fonts-liberation libnss3 lsb-release libgbm-dev xdg-utils sudo apt-get install -y libatk1.0-0t64 libc6 libcairo2 libdbus-1-3 libexpat1 libfontconfig1 libgcc-s1 libgdk-pixbuf-2.0-0 libglib2.0-0t64 libgtk-3-0t64 libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 ca-certificates fonts-liberation libnss3 lsb-release libgbm-dev xdg-utils
sudo apt-get update sudo apt-get update
sudo apt-get install -y libatk-bridge2.0-0t64 libcups2t64 libxcomposite1 libxdamage1 libpangocairo-1.0-0 libxfixes3 libxrandr2 libgbm1 libcairo2 libpango-1.0-0 libasound2t64 wget sudo apt-get install -y libatk-bridge2.0-0t64 libcups2t64 libxcomposite1 libxdamage1 libpangocairo-1.0-0 libxfixes3 libxrandr2 libgbm1 libcairo2 libpango-1.0-0 libasound2t64 wget
# NOTE: for future releases of ubuntu when need to update packages this was helpful https://itsfoss.com/unable-to-locate-package-error-ubuntu/ # NOTE: for future releases of ubuntu when need to update packages this was helpful https://itsfoss.com/unable-to-locate-package-error-ubuntu/
@@ -1392,15 +1402,19 @@ echo INSTALL AYANOVA
apt install zip unzip -y apt install zip unzip -y
mkdir /var/ayanova mkdir /var/ayanova
mkdir /var/ayanova/data mkdir /var/ayanova/data
mkdir /var/ayanova/Chrome
mkdir /var/ayanova/ChromeHeadlessShell
cd /var/ayanova cd /var/ayanova
curl -O https://www.ayanova.com/download/ayanova-subscription-linux-x64-server.zip && unzip -o ayanova-subscription-linux-x64-server.zip curl -O https://www.ayanova.com/download/ayanova-subscription-linux-x64-server.zip && unzip -o ayanova-subscription-linux-x64-server.zip
# put this server's own secrets in place of the shipped defaults
sed -i "s/Password=YOUR_PASSWORD_HERE;/Password=$DBPASSWORD;/" /var/ayanova/config.json
sed -i "s/12345YourRandom32CharacterSecret/$JWTSECRET/" /var/ayanova/config.json
# nginx is the only way in: listen on this server only, not on its public address
sed -i 's#http://[*]:7575#http://127.0.0.1:7575#' /var/ayanova/config.json
chown -vR :www-data /var/ayanova chown -vR :www-data /var/ayanova
# program files read only for the service account; it writes to data only
chmod -R go-w /var/ayanova
chmod -R g+rw /var/ayanova/data chmod -R g+rw /var/ayanova/data
chmod -R g+rwx /var/ayanova/Chrome # config.json holds the database password: readable by root and the service group only
chmod -R g+rwx /var/ayanova/ChromeHeadlessShell chmod 640 /var/ayanova/config.json
chmod g+rw /var/ayanova/
echo '[Unit]' >> /etc/systemd/system/ayanova.service echo '[Unit]' >> /etc/systemd/system/ayanova.service
echo 'Description=AyaNova server' >> /etc/systemd/system/ayanova.service echo 'Description=AyaNova server' >> /etc/systemd/system/ayanova.service
echo '' >> /etc/systemd/system/ayanova.service echo '' >> /etc/systemd/system/ayanova.service
@@ -1414,6 +1428,11 @@ echo 'SyslogIdentifier=ayanova-server' >> /etc/systemd/system/ayanova.service
echo 'User=www-data' >> /etc/systemd/system/ayanova.service echo 'User=www-data' >> /etc/systemd/system/ayanova.service
echo 'Environment=ASPNETCORE_ENVIRONMENT=Production' >> /etc/systemd/system/ayanova.service echo 'Environment=ASPNETCORE_ENVIRONMENT=Production' >> /etc/systemd/system/ayanova.service
echo 'Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false' >> /etc/systemd/system/ayanova.service echo 'Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false' >> /etc/systemd/system/ayanova.service
echo 'NoNewPrivileges=true' >> /etc/systemd/system/ayanova.service
echo 'ProtectSystem=strict' >> /etc/systemd/system/ayanova.service
echo 'ReadWritePaths=/var/ayanova/data' >> /etc/systemd/system/ayanova.service
echo 'PrivateTmp=true' >> /etc/systemd/system/ayanova.service
echo 'ProtectHome=true' >> /etc/systemd/system/ayanova.service
echo '' >> /etc/systemd/system/ayanova.service echo '' >> /etc/systemd/system/ayanova.service
echo '[Install]' >> /etc/systemd/system/ayanova.service echo '[Install]' >> /etc/systemd/system/ayanova.service
echo 'WantedBy=multi-user.target' >> /etc/systemd/system/ayanova.service echo 'WantedBy=multi-user.target' >> /etc/systemd/system/ayanova.service