build-deb.sh 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. #!/bin/bash
  2. set -e
  3. VERSION="0.6.9"
  4. PKG_NAME="oasis"
  5. ARCH=$(dpkg --print-architecture)
  6. SRC_DIR="$(cd "$(dirname "$0")/.." && pwd)"
  7. BUILD_DIR="/tmp/oasis-deb-build"
  8. DEB_ROOT="${BUILD_DIR}/${PKG_NAME}_${VERSION}_${ARCH}"
  9. INSTALL_DIR="/opt/oasis"
  10. if [ "$1" = "--arm64" ]; then
  11. ARCH="arm64"
  12. DEB_ROOT="${BUILD_DIR}/${PKG_NAME}_${VERSION}_${ARCH}"
  13. fi
  14. echo "=== Building Oasis ${VERSION} .deb (${ARCH}) ==="
  15. rm -rf "${DEB_ROOT}"
  16. mkdir -p "${DEB_ROOT}/DEBIAN"
  17. mkdir -p "${DEB_ROOT}${INSTALL_DIR}/src/server"
  18. mkdir -p "${DEB_ROOT}${INSTALL_DIR}/src/backend"
  19. mkdir -p "${DEB_ROOT}${INSTALL_DIR}/src/views"
  20. mkdir -p "${DEB_ROOT}${INSTALL_DIR}/src/models"
  21. mkdir -p "${DEB_ROOT}${INSTALL_DIR}/src/client"
  22. mkdir -p "${DEB_ROOT}${INSTALL_DIR}/src/configs"
  23. mkdir -p "${DEB_ROOT}${INSTALL_DIR}/scripts"
  24. mkdir -p "${DEB_ROOT}/usr/bin"
  25. mkdir -p "${DEB_ROOT}/usr/share/applications"
  26. mkdir -p "${DEB_ROOT}/usr/share/doc/${PKG_NAME}"
  27. mkdir -p "${DEB_ROOT}/lib/systemd/system"
  28. echo "Copying application files..."
  29. cp -r "${SRC_DIR}/src/server/package.json" "${DEB_ROOT}${INSTALL_DIR}/src/server/"
  30. cp -r "${SRC_DIR}/src/server/package-lock.json" "${DEB_ROOT}${INSTALL_DIR}/src/server/" 2>/dev/null || true
  31. cp "${SRC_DIR}/src/server/ssb_config.js" "${DEB_ROOT}${INSTALL_DIR}/src/server/"
  32. cp "${SRC_DIR}/src/server/ssb_metadata.js" "${DEB_ROOT}${INSTALL_DIR}/src/server/"
  33. cp "${SRC_DIR}/src/server/SSB_server.js" "${DEB_ROOT}${INSTALL_DIR}/src/server/"
  34. if [ -d "${SRC_DIR}/src/server/packages" ]; then
  35. cp -r "${SRC_DIR}/src/server/packages" "${DEB_ROOT}${INSTALL_DIR}/src/server/"
  36. find "${DEB_ROOT}${INSTALL_DIR}/src/server/packages" -name "node_modules" -type d -exec rm -rf {} + 2>/dev/null || true
  37. fi
  38. cp "${SRC_DIR}/src/backend/"*.js "${DEB_ROOT}${INSTALL_DIR}/src/backend/"
  39. cp -r "${SRC_DIR}/src/views/"*.js "${DEB_ROOT}${INSTALL_DIR}/src/views/"
  40. cp -r "${SRC_DIR}/src/models/"*.js "${DEB_ROOT}${INSTALL_DIR}/src/models/"
  41. cp -r "${SRC_DIR}/src/client" "${DEB_ROOT}${INSTALL_DIR}/src/"
  42. find "${DEB_ROOT}${INSTALL_DIR}/src/client" -name "*.py" -delete 2>/dev/null
  43. find "${DEB_ROOT}${INSTALL_DIR}/src/client" -name ".ruff_cache" -type d -exec rm -rf {} + 2>/dev/null || true
  44. cp -r "${SRC_DIR}/src/configs/oasis-config.json" "${DEB_ROOT}${INSTALL_DIR}/src/configs/"
  45. cp -r "${SRC_DIR}/src/configs/shared-state.js" "${DEB_ROOT}${INSTALL_DIR}/src/configs/" 2>/dev/null || true
  46. cp -r "${SRC_DIR}/scripts" "${DEB_ROOT}${INSTALL_DIR}/"
  47. cp "${SRC_DIR}/oasis.sh" "${DEB_ROOT}${INSTALL_DIR}/"
  48. cp "${SRC_DIR}/LICENSE" "${DEB_ROOT}${INSTALL_DIR}/"
  49. cat > "${DEB_ROOT}/DEBIAN/control" << EOF
  50. Package: ${PKG_NAME}
  51. Version: ${VERSION}
  52. Architecture: ${ARCH}
  53. Maintainer: SolarNET.HuB <solarnethub@riseup.net>
  54. Depends: nodejs (>= 18)
  55. Recommends: npm
  56. Installed-Size: $(du -sk "${DEB_ROOT}${INSTALL_DIR}" | cut -f1)
  57. Section: net
  58. Priority: optional
  59. Homepage: https://solarnethub.com
  60. Description: Oasis P2P Social Network
  61. Oasis is a P2P encrypted social network built on Secure Scuttlebutt (SSB).
  62. Zero browser JavaScript — all rendering is server-side HTML+CSS.
  63. Part of the SolarNET.HuB ecosystem.
  64. EOF
  65. cat > "${DEB_ROOT}/DEBIAN/postinst" << 'POSTINST'
  66. #!/bin/bash
  67. INSTALL_DIR="/opt/oasis"
  68. echo "Installing Node.js dependencies..."
  69. cd "${INSTALL_DIR}/src/server"
  70. npm install --production 2>&1 | tail -10
  71. node ../../scripts/patch-node-modules.js 2>/dev/null || true
  72. if ! id -u oasis >/dev/null 2>&1; then
  73. useradd --system --home-dir /var/lib/oasis --create-home --shell /usr/sbin/nologin oasis
  74. fi
  75. mkdir -p /var/lib/oasis/.ssb
  76. chown -R oasis:oasis /var/lib/oasis
  77. chown -R oasis:oasis "${INSTALL_DIR}"
  78. systemctl daemon-reload 2>/dev/null || true
  79. echo ""
  80. echo "=== Oasis installed ==="
  81. echo "Start: systemctl start oasis"
  82. echo "Enable: systemctl enable oasis"
  83. echo "Open: http://localhost:3000"
  84. echo ""
  85. POSTINST
  86. chmod 755 "${DEB_ROOT}/DEBIAN/postinst"
  87. cat > "${DEB_ROOT}/DEBIAN/prerm" << 'PRERM'
  88. #!/bin/bash
  89. set -e
  90. systemctl stop oasis 2>/dev/null || true
  91. systemctl disable oasis 2>/dev/null || true
  92. PRERM
  93. chmod 755 "${DEB_ROOT}/DEBIAN/prerm"
  94. cat > "${DEB_ROOT}/DEBIAN/postrm" << 'POSTRM'
  95. #!/bin/bash
  96. set -e
  97. if [ "$1" = "purge" ]; then
  98. rm -rf /opt/oasis
  99. userdel oasis 2>/dev/null || true
  100. rm -rf /var/lib/oasis
  101. fi
  102. systemctl daemon-reload 2>/dev/null || true
  103. POSTRM
  104. chmod 755 "${DEB_ROOT}/DEBIAN/postrm"
  105. cat > "${DEB_ROOT}/lib/systemd/system/oasis.service" << EOF
  106. [Unit]
  107. Description=Oasis P2P Social Network
  108. After=network.target
  109. [Service]
  110. Type=simple
  111. User=oasis
  112. Group=oasis
  113. WorkingDirectory=${INSTALL_DIR}
  114. ExecStart=/bin/sh ${INSTALL_DIR}/oasis.sh
  115. Restart=on-failure
  116. RestartSec=10
  117. Environment=HOME=/var/lib/oasis
  118. Environment=NODE_ENV=production
  119. [Install]
  120. WantedBy=multi-user.target
  121. EOF
  122. cat > "${DEB_ROOT}/usr/bin/oasis" << 'LAUNCHER'
  123. #!/bin/sh
  124. exec /bin/sh /opt/oasis/oasis.sh "$@"
  125. LAUNCHER
  126. chmod 755 "${DEB_ROOT}/usr/bin/oasis"
  127. cat > "${DEB_ROOT}/usr/share/applications/oasis.desktop" << EOF
  128. [Desktop Entry]
  129. Name=Oasis
  130. GenericName=P2P Social Network
  131. Exec=xdg-open http://localhost:3000
  132. Icon=applications-internet
  133. Terminal=false
  134. Type=Application
  135. Categories=Network;Chat;InstantMessaging;
  136. EOF
  137. cat > "${DEB_ROOT}/usr/share/doc/${PKG_NAME}/copyright" << EOF
  138. Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
  139. Upstream-Name: Oasis
  140. Source: https://code.03c8.net/KrakensLab/snh-oasis
  141. Files: *
  142. Copyright: 2022-2026 SolarNET.HuB / psy <epsylon@riseup.net>
  143. License: AGPL-3.0
  144. EOF
  145. echo "Building .deb package..."
  146. DEB_FILE="${BUILD_DIR}/${PKG_NAME}_${VERSION}_${ARCH}.deb"
  147. dpkg-deb --build "${DEB_ROOT}" "${DEB_FILE}"
  148. echo ""
  149. echo "=== Package built: ${DEB_FILE} ==="
  150. echo "Size: $(du -h "${DEB_FILE}" | cut -f1)"
  151. echo ""
  152. echo "Install: sudo dpkg -i ${DEB_FILE}"
  153. echo " sudo apt-get install -f"