diff --git a/.github/workflows/deploy-website.yml b/.github/workflows/deploy-website.yml new file mode 100644 index 00000000..769337cf --- /dev/null +++ b/.github/workflows/deploy-website.yml @@ -0,0 +1,44 @@ +name: Deploy FamiliarOS Website + +on: + push: + branches: + - main + workflow_dispatch: + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - name: Deploy on VPS + uses: appleboy/ssh-action@v1.0.3 + with: + host: ${{ secrets.VPS_HOST }} + username: ${{ secrets.VPS_USER }} + key: ${{ secrets.VPS_SSH_KEY }} + script: | + set -euo pipefail + cd /home/dev/src/FamiliarOS + + # Ensure we are on the latest main branch + git fetch origin + git checkout main || git checkout -b main origin/main + git reset --hard origin/main + + cd website + + # Production build env + export VITE_SUPERTOKENS_API_DOMAIN="${{ vars.VITE_SUPERTOKENS_API_DOMAIN || '' }}" + export VITE_SUPERTOKENS_WEBSITE_DOMAIN="${{ vars.VITE_SUPERTOKENS_WEBSITE_DOMAIN || '' }}" + export VITE_SUPERTOKENS_API_BASE_PATH="${{ vars.VITE_SUPERTOKENS_API_BASE_PATH || '/auth' }}" + export VITE_SUPERTOKENS_WEBSITE_BASE_PATH="${{ vars.VITE_SUPERTOKENS_WEBSITE_BASE_PATH || '/auth' }}" + export VITE_AUTH_API_BASE_URL="${{ vars.VITE_AUTH_API_BASE_URL || '' }}" + export VITE_GITHUB_OAUTH_ENABLED="${{ vars.VITE_GITHUB_OAUTH_ENABLED || 'false' }}" + export VITE_AUTH_API_TIMEOUT_MS="${{ vars.VITE_AUTH_API_TIMEOUT_MS || '8000' }}" + export VITE_AUTH_HEALTH_TIMEOUT_MS="${{ vars.VITE_AUTH_HEALTH_TIMEOUT_MS || '6000' }}" + + npm ci + npm run build + + # Deploy via the existing VPS deploy script (requires passwordless sudo or manual password entry) + sudo /home/dev/familiaros-deploy/deploy-website.sh diff --git a/.gitignore b/.gitignore index 89482895..98644fc4 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,7 @@ apps/desktop/dist-electron local/ .slim/deepwork/ docs +!website/docs *.diff MERGE_NOTES.md NEW_FILES.txt diff --git a/website/.github/workflows/deploy.yml b/website/.github/workflows/deploy.yml deleted file mode 100644 index 267828ca..00000000 --- a/website/.github/workflows/deploy.yml +++ /dev/null @@ -1,79 +0,0 @@ -name: Deploy FamiliarOS Website - -on: - push: - branches: - - main - workflow_dispatch: - -jobs: - build-and-deploy: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Setup Node - uses: actions/setup-node@v4 - with: - node-version: 22 - cache: npm - - - name: Install dependencies - run: npm ci - - - name: Build production bundle - env: - VITE_SUPERTOKENS_API_DOMAIN: ${{ vars.VITE_SUPERTOKENS_API_DOMAIN || '' }} - VITE_SUPERTOKENS_WEBSITE_DOMAIN: ${{ vars.VITE_SUPERTOKENS_WEBSITE_DOMAIN || '' }} - VITE_SUPERTOKENS_API_BASE_PATH: ${{ vars.VITE_SUPERTOKENS_API_BASE_PATH || '/auth' }} - VITE_SUPERTOKENS_WEBSITE_BASE_PATH: ${{ vars.VITE_SUPERTOKENS_WEBSITE_BASE_PATH || '/auth' }} - VITE_AUTH_API_BASE_URL: ${{ vars.VITE_AUTH_API_BASE_URL || '' }} - VITE_GITHUB_OAUTH_ENABLED: ${{ vars.VITE_GITHUB_OAUTH_ENABLED || 'false' }} - VITE_AUTH_API_TIMEOUT_MS: ${{ vars.VITE_AUTH_API_TIMEOUT_MS || '8000' }} - VITE_AUTH_HEALTH_TIMEOUT_MS: ${{ vars.VITE_AUTH_HEALTH_TIMEOUT_MS || '6000' }} - run: npm run build - - - name: Deploy static files to VPS - uses: appleboy/scp-action@v0.1.7 - with: - host: ${{ secrets.VPS_HOST }} - username: ${{ secrets.VPS_USER }} - key: ${{ secrets.VPS_SSH_KEY }} - source: "dist/*" - target: "/var/www/familiaros" - strip_components: 1 - rm: true - - - name: Fix permissions and reload nginx - uses: appleboy/ssh-action@v1.0.3 - with: - host: ${{ secrets.VPS_HOST }} - username: ${{ secrets.VPS_USER }} - key: ${{ secrets.VPS_SSH_KEY }} - script: | - set -euo pipefail - DEST="/var/www/familiaros" - NGINX_CONF="/etc/nginx/sites-available/familiaros.conf" - - chown -R www-data:www-data "$DEST" - - # Ensure clean URLs work (e.g. /pricing serves /pricing.html) - if ! grep -q '\$uri.html' "$NGINX_CONF"; then - sed -i 's|try_files \$uri \$uri/ /index.html;|try_files \$uri \$uri.html \$uri/ /index.html;|' "$NGINX_CONF" - echo "Updated nginx config for clean URLs." - fi - - nginx -t - systemctl reload nginx - - - name: Smoke test - uses: appleboy/ssh-action@v1.0.3 - with: - host: ${{ secrets.VPS_HOST }} - username: ${{ secrets.VPS_USER }} - key: ${{ secrets.VPS_SSH_KEY }} - script: | - curl -s -o /dev/null -w "https://${{ vars.PRIMARY_DOMAIN }}/ -> %{http_code}\n" "https://${{ vars.PRIMARY_DOMAIN }}/" - curl -s -o /dev/null -w "https://${{ vars.PRIMARY_DOMAIN }}/pricing -> %{http_code}\n" "https://${{ vars.PRIMARY_DOMAIN }}/pricing" - curl -s -o /dev/null -w "https://${{ vars.PRIMARY_DOMAIN }}/about -> %{http_code}\n" "https://${{ vars.PRIMARY_DOMAIN }}/about" diff --git a/website/docs/ops/DEPLOYMENT_RUNBOOK.md b/website/docs/ops/DEPLOYMENT_RUNBOOK.md index 8917a2aa..ed5230dc 100644 --- a/website/docs/ops/DEPLOYMENT_RUNBOOK.md +++ b/website/docs/ops/DEPLOYMENT_RUNBOOK.md @@ -36,7 +36,7 @@ GitHub OAuth is currently disabled by default. See [`GITHUB_AUTH_STATUS.md`](./G From the project directory on the VPS (or via SSH): ```bash -cd /home/dev/src/FamiliarOSWebsite +cd /home/dev/src/FamiliarOS/website npm ci npm run build sudo bash /home/dev/familiaros-deploy/deploy-website.sh @@ -80,7 +80,7 @@ Optional variables: `VITE_GITHUB_OAUTH_ENABLED` (default `false`), `VITE_AUTH_AP The SuperTokens self-hosted backend is in the `server/` directory. ```bash -cd /home/dev/src/FamiliarOSWebsite/server +cd /home/dev/src/FamiliarOS/website/server npm ci docker compose up -d npm run start