feat: add production deploy pipeline and fix dev CSS
Dev: - Add tailwind install + build to docker-compose startup so CSS is built inside the container — not dependent on local filesystem Production (docker-compose.prod.yml): - Gunicorn on 127.0.0.1:8001, bind-mounted static/media to host paths so Caddy can serve them directly - Runs migrate, tailwind build, collectstatic on startup Settings (production.py): - Disable SECURE_SSL_REDIRECT (Caddy handles redirects; Django would loop) - Add CSRF_TRUSTED_ORIGINS for nohypeai.net CI (.gitea/workflows/ci.yml): - Add push-to-main trigger - Add deploy job: SSHes to lintel-prod-01 as deploy, runs deploy/deploy.sh Server config (deploy/): - deploy/caddy/nohype.caddy — Caddy site config for nohypeai.net - deploy/sum-nohype.service — systemd unit for the compose stack - deploy/deploy.sh — deploy script (pull, build, restart) One-time manual steps required on lintel-prod-01 (need root): sudo cp deploy/sum-nohype.service /etc/systemd/system/ sudo cp deploy/caddy/nohype.caddy /etc/caddy/sites-enabled/ sudo systemctl daemon-reload && sudo systemctl enable sum-nohype sudo systemctl reload caddy Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
23
deploy/caddy/nohype.caddy
Normal file
23
deploy/caddy/nohype.caddy
Normal file
@@ -0,0 +1,23 @@
|
||||
nohypeai.net, www.nohypeai.net {
|
||||
encode gzip zstd
|
||||
|
||||
header {
|
||||
X-Content-Type-Options nosniff
|
||||
X-Frame-Options DENY
|
||||
Referrer-Policy strict-origin-when-cross-origin
|
||||
Permissions-Policy "geolocation=(), microphone=(), camera=()"
|
||||
X-Forwarded-Proto https
|
||||
}
|
||||
|
||||
handle_path /static/* {
|
||||
root * /srv/sum/nohype/static
|
||||
file_server
|
||||
}
|
||||
|
||||
handle_path /media/* {
|
||||
root * /srv/sum/nohype/media
|
||||
file_server
|
||||
}
|
||||
|
||||
reverse_proxy localhost:8001
|
||||
}
|
||||
34
deploy/deploy.sh
Executable file
34
deploy/deploy.sh
Executable file
@@ -0,0 +1,34 @@
|
||||
#!/usr/bin/env bash
|
||||
# Deploy script for No Hype AI — runs on lintel-prod-01 as deploy user.
|
||||
# Called by CI after a successful push to main.
|
||||
set -euo pipefail
|
||||
|
||||
SITE_DIR=/srv/sum/nohype
|
||||
APP_DIR=${SITE_DIR}/app
|
||||
|
||||
echo "==> Pulling latest code"
|
||||
git -C "${APP_DIR}" pull origin main
|
||||
|
||||
echo "==> Updating compose file"
|
||||
cp "${APP_DIR}/docker-compose.prod.yml" "${SITE_DIR}/docker-compose.prod.yml"
|
||||
|
||||
echo "==> Ensuring static/media directories exist"
|
||||
mkdir -p "${SITE_DIR}/static" "${SITE_DIR}/media"
|
||||
|
||||
echo "==> Building image"
|
||||
docker compose -f "${SITE_DIR}/docker-compose.prod.yml" build --no-cache
|
||||
|
||||
echo "==> Restarting service"
|
||||
sudo systemctl restart sum-nohype
|
||||
|
||||
echo "==> Waiting for health check"
|
||||
for i in $(seq 1 30); do
|
||||
if curl -fsS http://localhost:8001/ >/dev/null 2>&1; then
|
||||
echo "==> Site is up"
|
||||
exit 0
|
||||
fi
|
||||
sleep 3
|
||||
done
|
||||
echo "ERROR: site did not come up after 90s" >&2
|
||||
sudo journalctl -u sum-nohype --no-pager -n 50
|
||||
exit 1
|
||||
26
deploy/sum-nohype.service
Normal file
26
deploy/sum-nohype.service
Normal file
@@ -0,0 +1,26 @@
|
||||
[Unit]
|
||||
Description=No Hype AI (Docker Compose)
|
||||
Requires=docker.service
|
||||
After=docker.service network-online.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=deploy
|
||||
Group=www-data
|
||||
WorkingDirectory=/srv/sum/nohype
|
||||
|
||||
ExecStartPre=docker compose -f docker-compose.prod.yml pull --ignore-pull-failures
|
||||
ExecStart=docker compose -f docker-compose.prod.yml up --build
|
||||
ExecStop=docker compose -f docker-compose.prod.yml down
|
||||
|
||||
Restart=on-failure
|
||||
RestartSec=10
|
||||
TimeoutStartSec=300
|
||||
TimeoutStopSec=30
|
||||
|
||||
StandardOutput=journal
|
||||
StandardError=journal
|
||||
SyslogIdentifier=sum-nohype
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
Reference in New Issue
Block a user