278 lines
7.2 KiB
Markdown
278 lines
7.2 KiB
Markdown
# bincio_wiki — VPS configuration
|
|
|
|
## Server layout
|
|
|
|
```
|
|
/opt/bincio/ bincio_activity code (existing)
|
|
/opt/bincio_wiki/ bincio_wiki code (new)
|
|
|
|
/var/bincio/data/ bincio_activity data + shared DB
|
|
instance.db shared user/session/invite database
|
|
<handle>/ per-user activity data
|
|
|
|
/var/bincio/wiki/ bincio_wiki content
|
|
pages/ wiki markdown pages
|
|
stories/ blog markdown stories
|
|
|
|
/var/www/bincio/ bincio_activity static build (existing, bincio.org)
|
|
/var/www/bincio/wiki/ bincio_wiki static build (wiki.bincio.org)
|
|
```
|
|
|
|
Ports:
|
|
- `4041` — bincio_activity FastAPI (existing)
|
|
- `4042` — bincio_wiki FastAPI (new)
|
|
|
|
---
|
|
|
|
## Deploy procedure
|
|
|
|
Builds run **locally**. We push the results to the VPS.
|
|
|
|
### bincio_wiki deploy script: `deploy/vps/deploy.sh`
|
|
|
|
```bash
|
|
#!/usr/bin/env bash
|
|
set -e
|
|
VPS=root@95.216.55.151
|
|
REMOTE_CODE=/opt/bincio_wiki
|
|
REMOTE_WEB=/var/www/bincio/wiki
|
|
|
|
echo "Building Astro..."
|
|
cd "$(dirname "$0")/../.."
|
|
cd site && npm ci --silent && npm run build
|
|
cd ..
|
|
|
|
echo "Pushing code..."
|
|
rsync -az --delete \
|
|
--exclude='.git' \
|
|
--exclude='site/node_modules' \
|
|
--exclude='site/.astro' \
|
|
--exclude='site/dist' \
|
|
--exclude='__pycache__' \
|
|
--exclude='*.pyc' \
|
|
. "$VPS:$REMOTE_CODE/"
|
|
|
|
echo "Pushing static build..."
|
|
rsync -az --delete site/dist/ "$VPS:$REMOTE_WEB/"
|
|
|
|
echo "Restarting service..."
|
|
ssh "$VPS" systemctl restart bincio-wiki
|
|
|
|
echo "Done."
|
|
```
|
|
|
|
Run with: `bash deploy/vps/deploy.sh`
|
|
|
|
---
|
|
|
|
## Environment variables
|
|
|
|
### bincio_wiki FastAPI (`edit/server.py`)
|
|
|
|
| Variable | Production value | Local default |
|
|
|---|---|---|
|
|
| `SHARED_DB_PATH` | `/var/bincio/data/instance.db` | `../bincio_activity/data/instance.db` |
|
|
| `WIKI_PAGES_DIR` | `/var/bincio/wiki/pages` | `site/src/content/entries` |
|
|
| `WIKI_STORIES_DIR` | `/var/bincio/wiki/stories` | `site/src/content/blog` |
|
|
| `SESSION_DOMAIN` | `.bincio.org` | *(unset — host-only cookie)* |
|
|
|
|
### bincio_activity FastAPI (`bincio/serve/server.py`)
|
|
|
|
| Variable | Production value | Local default |
|
|
|---|---|---|
|
|
| `SESSION_DOMAIN` | `.bincio.org` | *(unset — host-only cookie)* |
|
|
|
|
### bincio_activity Astro build
|
|
|
|
| Variable | Production value | Purpose |
|
|
|---|---|---|
|
|
| `PUBLIC_WIKI_URL` | `https://wiki.bincio.org` | Wiki nav link + login redirect for wiki-only users |
|
|
| `PUBLIC_EDIT_ENABLED` | `true` | Enables edit UI in production |
|
|
|
|
### bincio_activity → bincio_activity (moved to activity subdomain)
|
|
|
|
| Variable | Production value |
|
|
|---|---|
|
|
| `PUBLIC_WIKI_URL` | `https://wiki.bincio.org` |
|
|
| `SESSION_DOMAIN` | `.bincio.org` |
|
|
|
|
---
|
|
|
|
## systemd service
|
|
|
|
`deploy/vps/bincio-wiki.service` — copy to `/etc/systemd/system/` on the VPS.
|
|
|
|
```ini
|
|
[Unit]
|
|
Description=BincioWiki API
|
|
After=network.target
|
|
|
|
[Service]
|
|
WorkingDirectory=/opt/bincio_wiki
|
|
ExecStart=/root/.local/bin/uv run uvicorn edit.server:app \
|
|
--host 127.0.0.1 \
|
|
--port 4042
|
|
Environment=SHARED_DB_PATH=/var/bincio/data/instance.db
|
|
Environment=WIKI_PAGES_DIR=/var/bincio/wiki/pages
|
|
Environment=WIKI_STORIES_DIR=/var/bincio/wiki/stories
|
|
Environment=SESSION_DOMAIN=.bincio.org
|
|
Restart=always
|
|
RestartSec=5
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
```
|
|
|
|
On the VPS:
|
|
```bash
|
|
cp /opt/bincio_wiki/deploy/vps/bincio-wiki.service /etc/systemd/system/
|
|
systemctl daemon-reload
|
|
systemctl enable bincio-wiki
|
|
systemctl start bincio-wiki
|
|
```
|
|
|
|
---
|
|
|
|
## nginx
|
|
|
|
### wiki.bincio.org — `deploy/vps/nginx-wiki.conf`
|
|
|
|
```nginx
|
|
server {
|
|
server_name wiki.bincio.org;
|
|
root /var/www/bincio/wiki;
|
|
index index.html;
|
|
|
|
location /api/ {
|
|
proxy_pass http://127.0.0.1:4042;
|
|
proxy_set_header Host $host;
|
|
proxy_set_header X-Real-IP $remote_addr;
|
|
}
|
|
location /pages/ {
|
|
proxy_pass http://127.0.0.1:4042;
|
|
proxy_set_header Host $host;
|
|
proxy_set_header X-Real-IP $remote_addr;
|
|
}
|
|
location /stories/ {
|
|
proxy_pass http://127.0.0.1:4042;
|
|
proxy_set_header Host $host;
|
|
proxy_set_header X-Real-IP $remote_addr;
|
|
}
|
|
location /rebuild/ {
|
|
proxy_pass http://127.0.0.1:4042;
|
|
proxy_set_header Host $host;
|
|
proxy_set_header X-Real-IP $remote_addr;
|
|
}
|
|
|
|
location / {
|
|
try_files $uri $uri/ $uri.html =404;
|
|
}
|
|
|
|
listen 443 ssl; # managed by Certbot
|
|
ssl_certificate /etc/letsencrypt/live/wiki.bincio.org/fullchain.pem;
|
|
ssl_certificate_key /etc/letsencrypt/live/wiki.bincio.org/privkey.pem;
|
|
include /etc/letsencrypt/options-ssl-nginx.conf;
|
|
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
|
|
}
|
|
|
|
server {
|
|
if ($host = wiki.bincio.org) {
|
|
return 301 https://$host$request_uri;
|
|
}
|
|
listen 80;
|
|
server_name wiki.bincio.org;
|
|
return 404;
|
|
}
|
|
```
|
|
|
|
### activity.bincio.org (bincio_activity moves here)
|
|
|
|
Add this block to the existing bincio_activity nginx config. The current
|
|
`bincio.org` block keeps the `/api/` proxy but loses the activity-specific
|
|
routes (see plan.md Phase 5).
|
|
|
|
```nginx
|
|
server {
|
|
server_name activity.bincio.org;
|
|
root /var/www/bincio;
|
|
index index.html;
|
|
|
|
client_max_body_size 2G;
|
|
client_body_timeout 300s;
|
|
|
|
location /api/ {
|
|
proxy_pass http://127.0.0.1:4041;
|
|
proxy_set_header Host $host;
|
|
proxy_set_header X-Real-IP $remote_addr;
|
|
proxy_read_timeout 120s;
|
|
}
|
|
location /data/ {
|
|
alias /var/bincio/data/;
|
|
add_header Cache-Control "no-cache, must-revalidate";
|
|
}
|
|
location /activity/ {
|
|
try_files $uri $uri/ /activity/index.html;
|
|
}
|
|
location /u/ {
|
|
try_files $uri $uri/ /index.html;
|
|
}
|
|
location / {
|
|
try_files $uri $uri/ $uri.html =404;
|
|
}
|
|
|
|
listen 443 ssl; # managed by Certbot
|
|
ssl_certificate /etc/letsencrypt/live/activity.bincio.org/fullchain.pem;
|
|
ssl_certificate_key /etc/letsencrypt/live/activity.bincio.org/privkey.pem;
|
|
include /etc/letsencrypt/options-ssl-nginx.conf;
|
|
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## First-time VPS setup (wiki)
|
|
|
|
```bash
|
|
# 1. Create directories
|
|
mkdir -p /var/bincio/wiki/pages /var/bincio/wiki/stories
|
|
mkdir -p /var/www/bincio/wiki
|
|
|
|
# 2. Push initial deploy
|
|
bash deploy/vps/deploy.sh
|
|
|
|
# 3. Install and start service
|
|
cp /opt/bincio_wiki/deploy/vps/bincio-wiki.service /etc/systemd/system/
|
|
systemctl daemon-reload && systemctl enable --now bincio-wiki
|
|
|
|
# 4. SSL certificate for wiki subdomain
|
|
certbot --nginx -d wiki.bincio.org
|
|
|
|
# 5. Install nginx config
|
|
cp /opt/bincio_wiki/deploy/vps/nginx-wiki.conf /etc/nginx/sites-available/bincio-wiki
|
|
ln -s /etc/nginx/sites-available/bincio-wiki /etc/nginx/sites-enabled/
|
|
nginx -t && systemctl reload nginx
|
|
|
|
# 6. Run DB migration (after schema changes to bincio_activity)
|
|
sqlite3 /var/bincio/data/instance.db < /opt/bincio_wiki/deploy/migrate.sql
|
|
```
|
|
|
|
---
|
|
|
|
## DB migration script: `deploy/migrate.sql`
|
|
|
|
```sql
|
|
-- Add access flags to users
|
|
ALTER TABLE users ADD COLUMN wiki_access INTEGER NOT NULL DEFAULT 1;
|
|
ALTER TABLE users ADD COLUMN activity_access INTEGER NOT NULL DEFAULT 0;
|
|
|
|
-- All existing users (bincio_activity members) get both flags
|
|
UPDATE users SET wiki_access = 1, activity_access = 1;
|
|
|
|
-- Add activity flag to invites
|
|
ALTER TABLE invites ADD COLUMN grants_activity INTEGER NOT NULL DEFAULT 0;
|
|
|
|
-- Set caps
|
|
INSERT OR REPLACE INTO settings VALUES ('max_wiki_users', '100');
|
|
INSERT OR REPLACE INTO settings VALUES ('max_activity_users', '30');
|
|
```
|