secubox-openwrt/package/secubox/secubox-app-hexojs
CyberMind-FR d03f73cb83 fix(hexojs): Disable static publishing, serve via container only
HexoJS now serves dynamically on :4000 via HAProxy vhost routing.
- Disabled auto_publish in metabolizer
- Disabled portal in hexojs
- /www stays free for SecuBox portal and other apps

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-25 06:45:10 +01:00
..
files fix(hexojs): Disable static publishing, serve via container only 2026-01-25 06:45:10 +01:00
Makefile chore: Bump package releases 2026-01-24 15:42:31 +01:00
README.md feat(hexojs): Add Gitea integration for content sync 2026-01-24 12:51:34 +01:00

SecuBox HexoJS

Self-hosted static blog generator for OpenWrt with Gitea integration.

Features

  • Hexo 8.x static site generator with Node.js 22 LTS
  • CyberMind theme with dark mode and modern design
  • Gitea integration for content management
  • Post and page management with Markdown
  • Media library for images and files
  • GitHub Pages deployment support
  • Preview server for local testing

Runs in LXC container with Alpine Linux.

Installation

# Install the package
opkg install secubox-app-hexojs

# Setup container and create site
hexoctl install
hexoctl site create default

# Enable and start service
uci set hexojs.main.enabled=1
uci commit hexojs
/etc/init.d/hexojs enable
/etc/init.d/hexojs start

Preview at http://<router-ip>:4000

Commands

Container Management

hexoctl install           # Download and setup LXC container
hexoctl uninstall         # Remove container (keeps data)
hexoctl update            # Update Hexo and dependencies
hexoctl status            # Show service status
hexoctl shell             # Open shell in container
hexoctl logs              # View container logs
hexoctl exec <cmd>        # Execute command in container

Site Management

hexoctl site create <name>   # Create new Hexo site
hexoctl site list            # List all sites
hexoctl site delete <name>   # Delete a site

Content Commands

hexoctl new post "Title"     # Create new blog post
hexoctl new page "Title"     # Create new page
hexoctl new draft "Title"    # Create new draft
hexoctl publish <slug>       # Publish a draft
hexoctl list posts           # List all posts (JSON)
hexoctl list drafts          # List all drafts (JSON)

Build Commands

hexoctl serve               # Start preview server (port 4000)
hexoctl build               # Generate static files
hexoctl clean               # Clean generated files
hexoctl deploy              # Deploy to configured target

Gitea Integration

Sync blog content from a Gitea repository.

Setup

# Enable Gitea integration
uci set hexojs.gitea.enabled=1
uci set hexojs.gitea.url='http://192.168.255.1:3000'
uci set hexojs.gitea.user='admin'
uci set hexojs.gitea.token='your-gitea-access-token'
uci set hexojs.gitea.content_repo='blog-content'
uci set hexojs.gitea.content_branch='main'
uci commit hexojs

Commands

hexoctl gitea setup         # Configure git credentials in container
hexoctl gitea clone         # Clone content repo from Gitea
hexoctl gitea sync          # Pull latest content and sync to Hexo
hexoctl gitea status        # Show Gitea sync status (JSON)

Workflow

┌─────────────┐    ┌─────────────┐    ┌─────────────┐
│   Gitea     │───►│   HexoJS    │───►│   Portal    │
│   Content   │    │   Build     │    │   Static    │
└─────────────┘    └─────────────┘    └─────────────┘
      │                  │                  │
  blog-content/      hexo generate      /www/blog/
   _posts/*.md         public/          index.html
  1. Create/edit posts in Gitea repository
  2. Run hexoctl gitea sync to pull changes
  3. Run hexoctl build to generate static site
  4. Static files available in /srv/hexojs/site/public/

Content Repository Structure

blog-content/
├── _posts/           # Published posts
│   └── 2025-01-24-hello-world.md
├── _drafts/          # Draft posts
├── images/           # Media files
├── about/            # About page
├── portfolio/        # Portfolio page
└── services/         # Services page

Configuration

Edit /etc/config/hexojs:

config hexojs 'main'
    option enabled '1'
    option http_port '4000'
    option data_path '/srv/hexojs'
    option active_site 'default'
    option memory_limit '512M'

config site 'default'
    option title 'My Blog'
    option subtitle 'Self-hosted on OpenWrt'
    option author 'Admin'
    option language 'en'
    option theme 'cybermind'
    option url 'http://localhost:4000'
    option root '/'
    option per_page '10'

config deploy 'deploy'
    option type 'git'
    option repo ''
    option branch 'gh-pages'

config gitea 'gitea'
    option enabled '0'
    option url 'http://192.168.255.1:3000'
    option user 'admin'
    option token ''
    option content_repo 'blog-content'
    option content_branch 'main'
    option auto_sync '0'

config theme_config 'theme'
    option default_mode 'dark'
    option allow_toggle '1'
    option accent_color '#f97316'

Directory Structure

/srv/hexojs/
├── site/                    # Hexo site
│   ├── source/
│   │   ├── _posts/          # Blog posts
│   │   ├── _drafts/         # Drafts
│   │   └── images/          # Media
│   ├── themes/
│   │   └── cybermind/       # CyberMind theme
│   ├── public/              # Generated static files
│   └── _config.yml          # Hexo config
├── content/                 # Cloned Gitea content repo
├── themes/                  # Shared themes
└── media/                   # Shared media

CyberMind Theme

Included dark theme with:

  • Responsive design
  • Dark/light mode toggle
  • Orange accent color (#f97316)
  • Terminal-style logo
  • Categories and tags support
  • Apps portfolio section

Troubleshooting

Container not starting

# Check container status
lxc-info -n hexojs

# View logs
hexoctl logs

# Reinstall container
hexoctl uninstall
hexoctl install

Gitea clone fails

# Verify credentials
hexoctl gitea status

# Re-setup git credentials
hexoctl gitea setup

# Check token has repo access
curl -H "Authorization: token YOUR_TOKEN" \
  http://192.168.255.1:3000/api/v1/user/repos

Build errors

# Clean and rebuild
hexoctl clean
hexoctl build

# Check inside container
hexoctl shell
cd /opt/hexojs/site
npm install
hexo generate --debug

Integration with Metabolizer

HexoJS works with the Metabolizer CMS pipeline:

Streamlit CMS → Gitea → HexoJS → Portal
   (edit)      (store)  (build)  (serve)

See secubox-app-metabolizer for the full CMS experience.

License

MIT License - CyberMind Studio 2025