From fe2495f897bbdfb2857573176733e600b86f7c48 Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 11 Nov 2025 07:08:27 -0400 Subject: [PATCH] v0.1.4 - Make response at root JSON --- STATIC_MUSL_GUIDE.md | 612 ++++++++++++++++++++++++++++++ build/bud04.o | Bin 19160 -> 19208 bytes build/bud08.o | Bin 8880 -> 9344 bytes build/ginxsom-fcgi | Bin 232840 -> 245216 bytes build/main.o | Bin 57672 -> 69672 bytes config/local-nginx.conf | 12 +- db/ginxsom.db | Bin 73728 -> 98304 bytes deploy_lt.sh | 285 ++++++++++++++ docs/PRODUCTION_MIGRATION_PLAN.md | 356 +++++++++++++++++ include/ginxsom.h | 4 + remote.nginx.config | 376 ++++++++++++++++++ restart-all.sh | 8 +- src/bud04.c | 4 +- src/bud08.c | 75 ++-- src/ginxsom.h | 4 + src/main.c | 383 ++++++------------- test_blob_1762770636.txt | 7 + tests/file_put_bud02.sh | 9 +- tests/file_put_production.sh | 265 +++++++++++++ tests/mirror_test_bud04.sh | 23 +- 20 files changed, 2095 insertions(+), 328 deletions(-) create mode 100644 STATIC_MUSL_GUIDE.md create mode 100755 deploy_lt.sh create mode 100644 docs/PRODUCTION_MIGRATION_PLAN.md create mode 100644 remote.nginx.config create mode 100644 test_blob_1762770636.txt create mode 100755 tests/file_put_production.sh diff --git a/STATIC_MUSL_GUIDE.md b/STATIC_MUSL_GUIDE.md new file mode 100644 index 0000000..2f857c4 --- /dev/null +++ b/STATIC_MUSL_GUIDE.md @@ -0,0 +1,612 @@ +# Static MUSL Build Guide for C Programs + +## Overview + +This guide explains how to build truly portable static binaries using Alpine Linux and MUSL libc. These binaries have **zero runtime dependencies** and work on any Linux distribution without modification. + +This guide is specifically tailored for C programs that use: +- **nostr_core_lib** - Nostr protocol implementation +- **nostr_login_lite** - Nostr authentication library +- Common dependencies: libwebsockets, OpenSSL, SQLite, curl, secp256k1 + +## Why MUSL Static Binaries? + +### Advantages Over glibc + +| Feature | MUSL Static | glibc Static | glibc Dynamic | +|---------|-------------|--------------|---------------| +| **Portability** | ✓ Any Linux | ⚠ glibc only | ✗ Requires matching libs | +| **Binary Size** | ~7-10 MB | ~12-15 MB | ~2-3 MB | +| **Dependencies** | None | NSS libs | Many system libs | +| **Deployment** | Single file | Single file + NSS | Binary + libraries | +| **Compatibility** | Universal | glibc version issues | Library version hell | + +### Key Benefits + +1. **True Portability**: Works on Alpine, Ubuntu, Debian, CentOS, Arch, etc. +2. **No Library Hell**: No `GLIBC_2.XX not found` errors +3. **Simple Deployment**: Just copy one file +4. **Reproducible Builds**: Same Docker image = same binary +5. **Security**: No dependency on system libraries with vulnerabilities + +## Quick Start + +### Prerequisites + +- Docker installed and running +- Your C project with source code +- Internet connection for downloading dependencies + +### Basic Build Process + +```bash +# 1. Copy the Dockerfile template (see below) +cp /path/to/c-relay/Dockerfile.alpine-musl ./Dockerfile.static + +# 2. Customize for your project (see Customization section) +vim Dockerfile.static + +# 3. Build the static binary +docker build --platform linux/amd64 -f Dockerfile.static -t my-app-builder . + +# 4. Extract the binary +docker create --name temp-container my-app-builder +docker cp temp-container:/build/my_app_static ./my_app_static +docker rm temp-container + +# 5. Verify it's static +ldd ./my_app_static # Should show "not a dynamic executable" +``` + +## Dockerfile Template + +Here's a complete Dockerfile template you can customize for your project: + +```dockerfile +# Alpine-based MUSL static binary builder +# Produces truly portable binaries with zero runtime dependencies + +FROM alpine:3.19 AS builder + +# Install build dependencies +RUN apk add --no-cache \ + build-base \ + musl-dev \ + git \ + cmake \ + pkgconfig \ + autoconf \ + automake \ + libtool \ + openssl-dev \ + openssl-libs-static \ + zlib-dev \ + zlib-static \ + curl-dev \ + curl-static \ + sqlite-dev \ + sqlite-static \ + linux-headers \ + wget \ + bash + +WORKDIR /build + +# Build libsecp256k1 static (required for Nostr) +RUN cd /tmp && \ + git clone https://github.com/bitcoin-core/secp256k1.git && \ + cd secp256k1 && \ + ./autogen.sh && \ + ./configure --enable-static --disable-shared --prefix=/usr \ + CFLAGS="-fPIC" && \ + make -j$(nproc) && \ + make install && \ + rm -rf /tmp/secp256k1 + +# Build libwebsockets static (if needed for WebSocket support) +RUN cd /tmp && \ + git clone --depth 1 --branch v4.3.3 https://github.com/warmcat/libwebsockets.git && \ + cd libwebsockets && \ + mkdir build && cd build && \ + cmake .. \ + -DLWS_WITH_STATIC=ON \ + -DLWS_WITH_SHARED=OFF \ + -DLWS_WITH_SSL=ON \ + -DLWS_WITHOUT_TESTAPPS=ON \ + -DLWS_WITHOUT_TEST_SERVER=ON \ + -DLWS_WITHOUT_TEST_CLIENT=ON \ + -DLWS_WITHOUT_TEST_PING=ON \ + -DLWS_WITH_HTTP2=OFF \ + -DLWS_WITH_LIBUV=OFF \ + -DLWS_WITH_LIBEVENT=OFF \ + -DLWS_IPV6=ON \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_C_FLAGS="-fPIC" && \ + make -j$(nproc) && \ + make install && \ + rm -rf /tmp/libwebsockets + +# Copy git configuration for submodules +COPY .gitmodules /build/.gitmodules +COPY .git /build/.git + +# Initialize submodules +RUN git submodule update --init --recursive + +# Copy and build nostr_core_lib +COPY nostr_core_lib /build/nostr_core_lib/ +RUN cd nostr_core_lib && \ + chmod +x build.sh && \ + sed -i 's/CFLAGS="-Wall -Wextra -std=c99 -fPIC -O2"/CFLAGS="-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0 -Wall -Wextra -std=c99 -fPIC -O2"/' build.sh && \ + rm -f *.o *.a 2>/dev/null || true && \ + ./build.sh --nips=1,6,13,17,19,44,59 + +# Copy and build nostr_login_lite (if used) +# COPY nostr_login_lite /build/nostr_login_lite/ +# RUN cd nostr_login_lite && make static + +# Copy your application source +COPY src/ /build/src/ +COPY Makefile /build/Makefile + +# Build your application with full static linking +RUN gcc -static -O2 -Wall -Wextra -std=c99 \ + -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0 \ + -I. -Inostr_core_lib -Inostr_core_lib/nostr_core \ + -Inostr_core_lib/cjson -Inostr_core_lib/nostr_websocket \ + src/*.c \ + -o /build/my_app_static \ + nostr_core_lib/libnostr_core_x64.a \ + -lwebsockets -lssl -lcrypto -lsqlite3 -lsecp256k1 \ + -lcurl -lz -lpthread -lm -ldl && \ + strip /build/my_app_static + +# Verify it's truly static +RUN echo "=== Binary Information ===" && \ + file /build/my_app_static && \ + ls -lh /build/my_app_static && \ + echo "=== Checking for dynamic dependencies ===" && \ + (ldd /build/my_app_static 2>&1 || echo "Binary is static") + +# Output stage - just the binary +FROM scratch AS output +COPY --from=builder /build/my_app_static /my_app_static +``` + +## Customization Guide + +### 1. Adjust Dependencies + +**Add dependencies** by modifying the `apk add` section: + +```dockerfile +RUN apk add --no-cache \ + build-base \ + musl-dev \ + # Add your dependencies here: + libpng-dev \ + libpng-static \ + libjpeg-turbo-dev \ + libjpeg-turbo-static +``` + +**Remove unused dependencies** to speed up builds: +- Remove `libwebsockets` section if you don't need WebSocket support +- Remove `sqlite` if you don't use databases +- Remove `curl` if you don't make HTTP requests + +### 2. Configure nostr_core_lib NIPs + +Specify which NIPs your application needs: + +```bash +./build.sh --nips=1,6,19 # Minimal: Basic protocol, keys, bech32 +./build.sh --nips=1,6,13,17,19,44,59 # Full: All common NIPs +./build.sh --nips=all # Everything available +``` + +**Common NIP combinations:** +- **Basic client**: `1,6,19` (events, keys, bech32) +- **With encryption**: `1,6,19,44` (add modern encryption) +- **With DMs**: `1,6,17,19,44,59` (add private messages) +- **Relay/server**: `1,6,13,17,19,42,44,59` (add PoW, auth) + +### 3. Modify Compilation Flags + +**For your application:** + +```dockerfile +RUN gcc -static -O2 -Wall -Wextra -std=c99 \ + -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0 \ # REQUIRED for MUSL + -I. -Inostr_core_lib \ # Include paths + src/*.c \ # Your source files + -o /build/my_app_static \ # Output binary + nostr_core_lib/libnostr_core_x64.a \ # Nostr library + -lwebsockets -lssl -lcrypto \ # Link libraries + -lsqlite3 -lsecp256k1 -lcurl \ + -lz -lpthread -lm -ldl +``` + +**Debug build** (with symbols, no optimization): + +```dockerfile +RUN gcc -static -g -O0 -DDEBUG \ + -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0 \ + # ... rest of flags +``` + +### 4. Multi-Architecture Support + +Build for different architectures: + +```bash +# x86_64 (Intel/AMD) +docker build --platform linux/amd64 -f Dockerfile.static -t my-app-x86 . + +# ARM64 (Apple Silicon, Raspberry Pi 4+) +docker build --platform linux/arm64 -f Dockerfile.static -t my-app-arm64 . +``` + +## Build Script Template + +Create a `build_static.sh` script for convenience: + +```bash +#!/bin/bash +set -e + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +BUILD_DIR="$SCRIPT_DIR/build" +DOCKERFILE="$SCRIPT_DIR/Dockerfile.static" + +# Detect architecture +ARCH=$(uname -m) +case "$ARCH" in + x86_64) + PLATFORM="linux/amd64" + OUTPUT_NAME="my_app_static_x86_64" + ;; + aarch64|arm64) + PLATFORM="linux/arm64" + OUTPUT_NAME="my_app_static_arm64" + ;; + *) + echo "Unknown architecture: $ARCH" + exit 1 + ;; +esac + +echo "Building for platform: $PLATFORM" +mkdir -p "$BUILD_DIR" + +# Build Docker image +docker build \ + --platform "$PLATFORM" \ + -f "$DOCKERFILE" \ + -t my-app-builder:latest \ + --progress=plain \ + . + +# Extract binary +CONTAINER_ID=$(docker create my-app-builder:latest) +docker cp "$CONTAINER_ID:/build/my_app_static" "$BUILD_DIR/$OUTPUT_NAME" +docker rm "$CONTAINER_ID" + +chmod +x "$BUILD_DIR/$OUTPUT_NAME" + +echo "✓ Build complete: $BUILD_DIR/$OUTPUT_NAME" +echo "✓ Size: $(du -h "$BUILD_DIR/$OUTPUT_NAME" | cut -f1)" + +# Verify +if ldd "$BUILD_DIR/$OUTPUT_NAME" 2>&1 | grep -q "not a dynamic executable"; then + echo "✓ Binary is fully static" +else + echo "⚠ Warning: Binary may have dynamic dependencies" +fi +``` + +Make it executable: + +```bash +chmod +x build_static.sh +./build_static.sh +``` + +## Common Issues and Solutions + +### Issue 1: Fortification Errors + +**Error:** +``` +undefined reference to '__snprintf_chk' +undefined reference to '__fprintf_chk' +``` + +**Cause**: GCC's `-O2` enables fortification by default, which uses glibc-specific functions. + +**Solution**: Add these flags to **all** compilation commands: +```bash +-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0 +``` + +This must be applied to: +1. nostr_core_lib build.sh +2. Your application compilation +3. Any other libraries you build + +### Issue 2: Missing Symbols from nostr_core_lib + +**Error:** +``` +undefined reference to 'nostr_create_event' +undefined reference to 'nostr_sign_event' +``` + +**Cause**: Required NIPs not included in nostr_core_lib build. + +**Solution**: Add missing NIPs: +```bash +./build.sh --nips=1,6,19 # Add the NIPs you need +``` + +### Issue 3: Docker Permission Denied + +**Error:** +``` +permission denied while trying to connect to the Docker daemon socket +``` + +**Solution**: +```bash +sudo usermod -aG docker $USER +newgrp docker # Or logout and login +``` + +### Issue 4: Binary Won't Run on Target System + +**Checks**: +```bash +# 1. Verify it's static +ldd my_app_static # Should show "not a dynamic executable" + +# 2. Check architecture +file my_app_static # Should match target system + +# 3. Test on different distributions +docker run --rm -v $(pwd):/app alpine:latest /app/my_app_static --version +docker run --rm -v $(pwd):/app ubuntu:latest /app/my_app_static --version +``` + +## Project Structure Example + +Organize your project for easy static builds: + +``` +my-nostr-app/ +├── src/ +│ ├── main.c +│ ├── handlers.c +│ └── utils.c +├── nostr_core_lib/ # Git submodule +├── nostr_login_lite/ # Git submodule (if used) +├── Dockerfile.static # Static build Dockerfile +├── build_static.sh # Build script +├── Makefile # Regular build +└── README.md +``` + +### Makefile Integration + +Add static build targets to your Makefile: + +```makefile +# Regular dynamic build +all: my_app + +my_app: src/*.c + gcc -O2 src/*.c -o my_app \ + nostr_core_lib/libnostr_core_x64.a \ + -lssl -lcrypto -lsecp256k1 -lz -lpthread -lm + +# Static MUSL build via Docker +static: + ./build_static.sh + +# Clean +clean: + rm -f my_app build/my_app_static_* + +.PHONY: all static clean +``` + +## Deployment + +### Single Binary Deployment + +```bash +# Copy to server +scp build/my_app_static_x86_64 user@server:/opt/my-app/ + +# Run (no dependencies needed!) +ssh user@server +/opt/my-app/my_app_static_x86_64 +``` + +### SystemD Service + +```ini +[Unit] +Description=My Nostr Application +After=network.target + +[Service] +Type=simple +User=myapp +WorkingDirectory=/opt/my-app +ExecStart=/opt/my-app/my_app_static_x86_64 +Restart=always +RestartSec=5 + +[Install] +WantedBy=multi-user.target +``` + +### Docker Container (Minimal) + +```dockerfile +FROM scratch +COPY my_app_static_x86_64 /app +ENTRYPOINT ["/app"] +``` + +Build and run: +```bash +docker build -t my-app:latest . +docker run --rm my-app:latest --help +``` + +## Reusing c-relay Files + +You can directly copy these files from c-relay: + +### 1. Dockerfile.alpine-musl +```bash +cp /path/to/c-relay/Dockerfile.alpine-musl ./Dockerfile.static +``` + +Then customize: +- Change binary name (line 125) +- Adjust source files (line 122-124) +- Modify include paths (line 120-121) + +### 2. build_static.sh +```bash +cp /path/to/c-relay/build_static.sh ./ +``` + +Then customize: +- Change `OUTPUT_NAME` variable (lines 66, 70) +- Update Docker image name (line 98) +- Modify verification commands (lines 180-184) + +### 3. .dockerignore (Optional) +```bash +cp /path/to/c-relay/.dockerignore ./ +``` + +Helps speed up Docker builds by excluding unnecessary files. + +## Best Practices + +1. **Version Control**: Commit your Dockerfile and build script +2. **Tag Builds**: Include git commit hash in binary version +3. **Test Thoroughly**: Verify on multiple distributions +4. **Document Dependencies**: List required NIPs and libraries +5. **Automate**: Use CI/CD to build on every commit +6. **Archive Binaries**: Keep old versions for rollback + +## Performance Comparison + +| Metric | MUSL Static | glibc Dynamic | +|--------|-------------|---------------| +| Binary Size | 7-10 MB | 2-3 MB + libs | +| Startup Time | ~50ms | ~40ms | +| Memory Usage | Similar | Similar | +| Portability | ✓ Universal | ✗ System-dependent | +| Deployment | Single file | Binary + libraries | + +## References + +- [MUSL libc](https://musl.libc.org/) +- [Alpine Linux](https://alpinelinux.org/) +- [nostr_core_lib](https://github.com/chebizarro/nostr_core_lib) +- [Static Linking Best Practices](https://www.musl-libc.org/faq.html) +- [c-relay Implementation](./docs/musl_static_build.md) + +## Example: Minimal Nostr Client + +Here's a complete example of building a minimal Nostr client: + +```c +// minimal_client.c +#include "nostr_core/nostr_core.h" +#include + +int main() { + // Generate keypair + char nsec[64], npub[64]; + nostr_generate_keypair(nsec, npub); + + printf("Generated keypair:\n"); + printf("Private key (nsec): %s\n", nsec); + printf("Public key (npub): %s\n", npub); + + // Create event + cJSON *event = nostr_create_event(1, "Hello, Nostr!", NULL); + nostr_sign_event(event, nsec); + + char *json = cJSON_Print(event); + printf("\nSigned event:\n%s\n", json); + + free(json); + cJSON_Delete(event); + return 0; +} +``` + +**Dockerfile.static:** +```dockerfile +FROM alpine:3.19 AS builder +RUN apk add --no-cache build-base musl-dev git autoconf automake libtool \ + openssl-dev openssl-libs-static zlib-dev zlib-static + +WORKDIR /build + +# Build secp256k1 +RUN cd /tmp && git clone https://github.com/bitcoin-core/secp256k1.git && \ + cd secp256k1 && ./autogen.sh && \ + ./configure --enable-static --disable-shared --prefix=/usr CFLAGS="-fPIC" && \ + make -j$(nproc) && make install + +# Copy and build nostr_core_lib +COPY nostr_core_lib /build/nostr_core_lib/ +RUN cd nostr_core_lib && \ + sed -i 's/CFLAGS="-Wall/CFLAGS="-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0 -Wall/' build.sh && \ + ./build.sh --nips=1,6,19 + +# Build application +COPY minimal_client.c /build/ +RUN gcc -static -O2 -Wall -std=c99 \ + -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0 \ + -Inostr_core_lib -Inostr_core_lib/nostr_core -Inostr_core_lib/cjson \ + minimal_client.c -o /build/minimal_client_static \ + nostr_core_lib/libnostr_core_x64.a \ + -lssl -lcrypto -lsecp256k1 -lz -lpthread -lm -ldl && \ + strip /build/minimal_client_static + +FROM scratch +COPY --from=builder /build/minimal_client_static /minimal_client_static +``` + +**Build and run:** +```bash +docker build -f Dockerfile.static -t minimal-client . +docker create --name temp minimal-client +docker cp temp:/minimal_client_static ./ +docker rm temp + +./minimal_client_static +``` + +## Conclusion + +Static MUSL binaries provide the best portability for C applications. While they're slightly larger than dynamic binaries, the benefits of zero dependencies and universal compatibility make them ideal for: + +- Server deployments across different Linux distributions +- Embedded systems and IoT devices +- Docker containers (FROM scratch) +- Distribution to users without dependency management +- Long-term archival and reproducibility + +Follow this guide to create portable, self-contained binaries for your Nostr applications! \ No newline at end of file diff --git a/build/bud04.o b/build/bud04.o index 57da53461ca8175479b98e8965a08bb8b1a4b9ee..1c8d1e5832ae9485e9fe6de3820dff0b1ee3b873 100644 GIT binary patch delta 1041 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 literal 8880 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 diff --git a/build/ginxsom-fcgi b/build/ginxsom-fcgi index 70c550887368f30b9ac3d908162e0f932b7222a2..43dde29bdc7504940f2da87dbea9aad275eab871 100755 GIT binary patch literal 245216 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 z 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�@6*El2?;U$Q#L9$veq*^waKT_(Aef za(9ZZ*OLrCOV*LQ$T!LN$&bl{$d}32$+yXI1v>s-hCd=dC%+=U zC4VG;Cyg4NK9=lEo;saw<8K%q9y-H(5$nkk^ubBUh4} zXX|pWX82CBhTK3NAB3FOIS53(njNM1k=B!`n1k&iyF?~}xE8ktG<<#?IQ@C?#H=8;9D zms~_%M@~~;P=WUu8LlE%lXsC1kPnl!4D$i?Imas|1Pyp6n@tRXj$o5;=NR&qP}GWja`25I5?`dxR1bNw?>Z4F5`A!2C9w`=0b$jwAO{p9|7-`Yx1rB~K%Jl6}Ylf_@KKSe%A){#5OSIM`?z2tuKAo&g1Nd7|pNm}TicOswXI^#r!Pa(ULy~#dgI`gqJ zJc3Lj$C4At%g8xo9yy=%kynwGv2gz^9AIvb@ z<5z|)8?+w8lJVrJ)y&2jnN@7i1O3_16slNFF2qBzsNQ_3FU!+ljQ2 zDY^Rk$qb)C_9V|G`;&vo3&~5#RB{}dMJ{?u=Rcj{S)`LJAd5*aSw>cpUB>8q{>Jc1 z@>cRr@;-7O?cxT8A0?k8pCz}GFO#p4_2gdi6Y>B#hcfb771s?Oxe zWOvd=o=5g4hmjYNx6y7SGn`INBBztx@^rh;X4py2CFhfV@@jG!c_VoIKA>ShRk{^=?$U|f!`4jmk*`9WBGVOUMhEF0-BfsYJ+Ort$ zMJAF1$YJCq|z^g!Gc-gQAUTpuCV$}kkCFEh3~wf%CA;0C%l!hwFO#p6?~wbq=y)HPVX}ezlKhrDLLMWHCw2M`WG6D7 zJe53y>`C?^`;$Y-3&|969GOMVAa}5z<}jQ~7LX<6Lh@>IDfxHu7V>U#J^2V(OFlzx zCwG#&$+yV8y~_xs!Z@e3$%?Y#&RW?9`YS>ANeWy1^ErxNd8RzP8v_^dUqtPWLGkQJcH~- zo=*-WFC>%5baDbYg`7doA#=zA@)+lZVupQW1$iy`H*zI;D|t70ANdgZ4{{6n9Qh*o z3b}`Tm;4v`DfuP&E%_sPj0}(+o}s>y@#LxGS!5zPfE-R#=2l*=b4*4P3KprB$BY!6U zBx9!P^0#L_jwj>EQ^_;P$GGos4#O9ac5)bbF*%wXM?TK|w1U5&cpN#2oJP(h9i)q#M=l`C$X{6Bs~NtIyn$Rr z-cGJ1?%&tw;}8+kf;HhCAv zL0^Ukk~Nf%WOym{{!)g=keTEZaweHe9+Jy zFj-4(CF{sn$UWr!+&_Dt;r-<2Dg;x3d4I z->m!ROvXEhJjnd}F+7wUMUEy%a$h}z;Vkkpawh2{^GP@9Cl`@R$Q#INat(P8`2hI{ zxtV;1+)nNy-yq*7KPJB*yU_pqhT$K{-$~0qbvtz;+^SO}W z6!NaSwLF92EOI(Ii_9inZZIHF-O^mORAr-N*1o@&V@eIKxkq z+sPf|YveoRKC*%Qg8Yj7o;*taMjG37dvqY<$ape=JcH~-CX)Tg+0^4f438wAV|^}R zcr-bVoJ?Lu&LMNie9}$&$wlOKSK^GkFKOj=Z1TNY;{1liSE0S?h)ZchCAzM_ySjb(uLt^ zBlP|8b1&*sf4Y1rt@;@g#aMMTF`41bQ_#gosk z49A!mYVrTGW5Z0dg_>t+Z_wc+GK9Yk{^FXlsGC7HDgMwiak>fwmTCYk{^FXlsGC z7HDgMwiftb-U4|!1M&+?%6;zQ{&_k7%j?=!y|xx;Yk{^FXlsGC7HDgMwiak>fwmTC zYk{^FXlsGC7HDgM<}J{U!L-q%FSI32&nYeOm)Zsn>_4Qxz2Cr66&!fYph5lZL;6tM zJbh$H@@sD#2}a80eWG@_QpML3Y>XhUA4Q8V?^m@mx*HAab%JEZ$4^UZ`2);|6_DSU zRq^j{E}v-1?`tm4Hsv+VN)MrgyaXQy9N8L&w)g{QfcJ)s(-;e99=#RzDJM7_U

l2`0ut7|0Bk)%+c{bWBg;S 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 l+aW3;(&`M&2n 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 z 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 VQc{1zP4H&dlh5%IL$eO9 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 WW}o%yE`LK`t@t`al&w@Jf&L$y^KAA2 literal 57672 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

x#}3a0Oa6&c_Hx627WE@w*h`R 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 U)~mDYSMlJD(mK6K{beZqyPW_ diff --git a/config/local-nginx.conf b/config/local-nginx.conf index 5231a85..99753e5 100644 --- a/config/local-nginx.conf +++ b/config/local-nginx.conf @@ -351,10 +351,10 @@ http { autoindex_format json; } - # Root redirect + # Root redirect - Server info endpoint location = / { - return 200 "Ginxsom Blossom Server\nEndpoints: GET /, PUT /upload, GET /list/\nHealth: GET /health\n"; - add_header Content-Type text/plain; + return 200 '{\n "server": "ginxsom",\n "version": "1.0.0",\n "description": "Ginxsom Blossom Server",\n "endpoints": {\n "blob_get": "GET /",\n "blob_head": "HEAD /",\n "upload": "PUT /upload",\n "upload_requirements": "HEAD /upload",\n "list": "GET /list/",\n "delete": "DELETE /",\n "mirror": "PUT /mirror",\n "report": "PUT /report",\n "health": "GET /health"\n },\n "supported_buds": [\n "BUD-01",\n "BUD-02",\n "BUD-04",\n "BUD-06",\n "BUD-08",\n "BUD-09"\n ],\n "limits": {\n "max_upload_size": 104857600,\n "supported_mime_types": [\n "image/jpeg",\n "image/png",\n "image/webp",\n "image/gif",\n "video/mp4",\n "video/webm",\n "audio/mpeg",\n "audio/ogg",\n "text/plain",\n "application/pdf"\n ]\n },\n "authentication": {\n "required_for_upload": false,\n "required_for_delete": true,\n "required_for_list": false,\n "nip42_enabled": true\n }\n}'; + add_header Content-Type application/json; add_header Access-Control-Allow-Origin * always; add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, HEAD, OPTIONS, PATCH" always; add_header Access-Control-Allow-Headers "Authorization, Content-Type, Content-Length, Accept, Origin, User-Agent, DNT, Cache-Control, X-Mx-ReqToken, Keep-Alive, X-Requested-With, If-Modified-Since, *" always; @@ -683,10 +683,10 @@ http { autoindex_format json; } - # Root redirect + # Root redirect - Server info endpoint location = / { - return 200 "Ginxsom Blossom Server (HTTPS)\nEndpoints: GET /, PUT /upload, GET /list/\nHealth: GET /health\n"; - add_header Content-Type text/plain; + return 200 '{\n "server": "ginxsom",\n "version": "1.0.0",\n "description": "Ginxsom Blossom Server (HTTPS)",\n "endpoints": {\n "blob_get": "GET /",\n "blob_head": "HEAD /",\n "upload": "PUT /upload",\n "upload_requirements": "HEAD /upload",\n "list": "GET /list/",\n "delete": "DELETE /",\n "mirror": "PUT /mirror",\n "report": "PUT /report",\n "health": "GET /health"\n },\n "supported_buds": [\n "BUD-01",\n "BUD-02",\n "BUD-04",\n "BUD-06",\n "BUD-08",\n "BUD-09"\n ],\n "limits": {\n "max_upload_size": 104857600,\n "supported_mime_types": [\n "image/jpeg",\n "image/png",\n "image/webp",\n "image/gif",\n "video/mp4",\n "video/webm",\n "audio/mpeg",\n "audio/ogg",\n "text/plain",\n "application/pdf"\n ]\n },\n "authentication": {\n "required_for_upload": false,\n "required_for_delete": true,\n "required_for_list": false,\n "nip42_enabled": true\n }\n}'; + add_header Content-Type application/json; add_header Access-Control-Allow-Origin * always; add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, HEAD, OPTIONS, PATCH" always; add_header Access-Control-Allow-Headers "Authorization, Content-Type, Content-Length, Accept, Origin, User-Agent, DNT, Cache-Control, X-Mx-ReqToken, Keep-Alive, X-Requested-With, If-Modified-Since, *" always; diff --git a/db/ginxsom.db b/db/ginxsom.db index 3354f30c15cb658d4e0b4c92f16b68af8e684dbf..903f13d936e70d29c68bd32d58131082402f9146 100644 GIT binary patch delta 12701 zcmeHNYmi*Ub)LKP*xA{cJ7@)x0Lu~%U?FLx+kN|X_XP=dSM08&)ng?f<{`Z5zPDQ} zLc7aqRoF@4VeK*k^RShvijs1OjSczX{4hiT{0ON~l^;nQW3Y+;#CaL84NhF;RK=8o z3Hk25yV@B7me{o`R3$so)ajW!r%#_g=kz(>>AU`-aMxX>&ss_}OA1Yksez7)K?d|NZJzwA4wW0fm?#=aM<o0#qNilPju8P+v;C0e6sSb{Lf356+cwDH-9RBr0b31vcfmY%R8M0gRAp=WkJgvgW8WtJSAX0mt$BgD8x-w;B zEhma`Ej@6+0RK!Bc-B~s2Qfty@G$VD3`1%ZiSbJ-Le6bO8KFXM&4h^+@gy-3(N_HnQ@HOc<-YP%A8xS;a_Tf@IE!dAi|2HI_(gnKDd4 zsev!F3X~N@C{CC(5YSwnvcY0x7^#4BL$Gk>V*@l(S~A6`q?CvtG|~i28|qO>IL8+{ zA}sJpWQ+_mE=I%=u|Z^#^?M=`J`JK!>o|&yjr~|j=@I2~U+F+7%eWwf1S0lg6B%E{ zGG#-tt0AP3S_p&fiJ2F&ID!NO+LIw?u#dolC`5Qn!(yN;-wS*id!UF&xil1EhC@)# zj|IcVC}=UFn4ZL5AOl9Q+rE}O_Nf=M0DMRs!5FQzMn`eTQ#P>)B0n%*1g#26;yCo< z*myFI!jNmCMHE`;3ocZoIQ3&gL)g5DWP`?(^GLCbjZzT}p=QQR=v!euqGPMD|D44! z^$2(>VwvwV>=J|J@Yqv6weS`N+we0ko~4#*;TZzedDIsSc5A{QhHTi=fG}{iG!}l? zh_K|4DQ+|+iQ2LCl%{NgAkr~`KHN~#I*b%aMeFf>vKpPPoTni*vb35^Y52k|(cR~6cdv4}+v{HJUg-9?U2d-STJ0ybzo|V_ z`%3N0wLhv&)gHqCme;9^yzf>U<$S>z?|Jar(b{)%7lXK9@7yQlJsI&pbN3u!cBRDf zbGGfvKDmE%=NwVlkrDSU-<}coREIO-?!!Y^$%W%RADPF>nqm=lx{$TXy={N8zh9&_B518rsf z$)tx?bb>Joy`BG+kW!X%bdQ_wibGzh3;>m`&#Jikjj3WoirJpofjFM z1^tZ9LU%@I@i(KhD4Nk(D9q?Apry3Ko9fV@!_s#@eW%HLDf7wnnMUSV9R96z2Z{eiul{ZI z>FV!Pw^zgJ`s#(<&s3}RJ??+F1Jy5AA8xLl66ZfuYrxf1ZGZJc?Jqdp2fG_?{vv1m zh&p68-#TRujaF@L%ffJP`?q`Ahr8Q{yV{5Q+J`&ahdbtmjk$@pw|_mH3}?(oW;RdV zrp6}{zumYXR^q*@7lw%syV-DR;?TBsP6M_4nz;qy%l@`epPO&AuKud_pI+HM+}b|e z(muSReR%o8M2E(0*#4zl7&a2E^M!FT43go(;#vF9Zy(b3AxVY{s@dHB?WToq?=X6* z*UdMdzVnmrf~-)HI5qmQKb_65a*jUH>AYE|cRTK1x*x24s%y6VQhB)ZOP#g4E=?8x ztXM8woBw=1-_h&bUHxwL1KksquT@s(Ud`<}(ZAwAWwj$`!57(XZmF3|?vc5@hjimT zLnjk=?!W1L-Zfk6xG0%msX5Kf|GuCxOi)iJXk5G*6XcT#E?VkooPXl=mKhMh&mw*_ zerXs=*=&ehDtA%NkVN2@y23J6-Bl*M({b-b!hgf=axAabRM`Mm|tD)45`%_GppRA z*R||I&){R3ArUrjNLv@3*3MdguHqCrwW|sI1 z6D~0UZl7?=&bA4u;53_%E=>3?a^<&6mD?u_Uu~a|1T347oSty0S@l~c96CK=Csazp z(0l4%-{<^;b23`vJVa}SZ{*H(MskJC`DQ(K|H|D^d$9V`D(#-GJX7iE+FPFO{Kw96 zi55T9@wD?JJb3Sk6F1yg8lDRzccK`f#KbX*Nl(NuOytVQ`~#-KkoZIsJ~K-L)DfQc@ToN_@{zSTzj4ok z9EEXY$*H9u*grZy#hs|gP$&eUlqeufB(x_2LKrcqTHuBN9so3WCp&f(DJOlzhhB`EL_G@;| zOV;pFbw(&BlbT)W$P+q7h2{w!VXXo_6r$`z)<&@xJdlhj6pq*$uE>g*02t^v=liXq z-9OqY8c~u-X(OyV0FDp`gyQr-2`7Bin}&`77m!SZ-a;TcUnH_E@g!T372*FYM_J#^ zNRaNIH?Chx6y5yc+3R;y=BAkKMD?guOoWUnU>42-Y9fFeAOMBLO!^e4Qi4MW-{LXN z2nuznQTKVQ$L(~GI zaQuZ<`R-kw_}6JqS0?abTd3Oom;i|ozN9__9u-lTY7~uOks%y46EG8Q__T2FZ4vl9 zFu<7nG~B@0wPhjIVZ;sa0196U01EyXI4fe!h9WvFKQL;o@$$L2w&h1 z_=-`4G%PU&xC8$W5bA^xY%B>lH1SQOZ88;Z?GS`>l0;~=rIA7@#3NxsL`aXv3b9H{~Ft3G4V}ZjF z>r);{6$9u97#!3hHU$VPfTI#OB}gTpT`a^Z1(?zTS)!1igu46MXIho8|9hDdCdLn& z-tnVTs&{%)#l3f^>FM#w>E3NSyioeR#PfP-FPDh60JV6!_`d!`ro{ViiX)(9F_wdX zq?oY+P?BeqjDdRjB!C704k59Dc39{O33EvhI}cbLUS2eucaLX6rHSl*lF4*UG;Pep z(OV{G*4pXGBWnRACZhCGzLv;dkN0}vCj4M_W8b_aK96`vbm)13!07=o4De3iYY3Fk zen{b3Qj(Ba!USqq32Z3=Dt(U-L_9(}UisWtN`!3ET8JZZ}J-&-xKiGfW(5++J z(^)rNHNPjpQc>&t7lvE+WONNsSd`b0HrX@npZvpR4rvS>8DqPr?DdEHqdhwheH5F3 z9Cz!L^HN;17}UEJ^e#U4Z>>`7eW6{7lMgL(==_;IMYumXxpUWV?IpJ#8owi$nIsG6 z!j`S`GVKHOwj>BW_nqBsGC8-m`Rvs6M{nWNhi}|-9XWRNw%e(N7{K&W`@CSwyc9XW zduIc|zas*l`||^>QtUjI2r+Qe6{jayDmd>v|BKcMcD#~JaQW#8)H~w#X9wFm2Y=i; z!FG{MfKo9`W=K!)r9%22xweqafU17HXZZVb6G%*u)uM2>1+;$=VE=F5(z=3SolMZz zsN`PDtpb4|l)JLMWz})r+c&M8PqenJ+?y9(XKq=|cdU>&B!4G_lM&bZOu8p>nZ#A(IA|{Y-9c!G-0y#KNln9L$g9Zq?5|L^k$0m`75bTBIYOon{ zknu)nZK0|p!09YH4oVwj#K8Z3%}}|bZ{>&R9tAidkZmK|qk+&s>p5CmzRm#6vy7#U zcMPT(=DAegxT52;>5|Zli40B*G!6`7KH7fP0DY7VlVs8gDGM4Z7Cj1Xk`{mskqn^@ z!J$Pw{C0PWD=s02PE+WeXm1WV6yPX20?J@#M1#o)xi&Iy^%dG7*MMs89sR3^)xu zhQx;?tr=f&O{MkFbwNuOT0#Gm?@cuW6eLlk4Gc;iZaDUm!t6*srX`UsCm;R_Y}*^bKiDO zZd~s4omzM4kDX%qb1?0bH>`5{n%A!zE_S_vfOPWZ^YHac>&|xyXy~tMI_n2Oe15c)!yzOc0b&G6RsaD zFTPm$R^{Hxwyrn2p6a^2YeV_v&Tn=eFFn!Ok4pzPly7+a#ED`SiI-Zyk3!TTXEA_B zqYd#$EpVxT#lDowSyqjWcPtxsq-+*f-7OS%+cRO_u?%aRsSeA^u;Gl&q6?<1UK&cd zv{gfmMU+EXziz1oOxEe^Uuw3ywK;j|NdHn3CE2{McVuX(`P^J{F$o8a4`jOjHFe(4 z7{A=M&ikh38<&kVmI_EO@tQ?>{+>ni-t{BR1D6b){Aa|`=ES9?{&s=H`;Y7@xYy)XHYbj} zTyS5S`)*hB_a{aQ^{Khx?q+Rbu$Wv$NEP7hNq)McBcIQ8Rmv~rR(HPsHmM8}ng6PO zr8-^R*!_d<&v)P0eQxF1$~~2Vu3vOL*)>(}?|i*$efgW^ba6Gt7Jxy4M(j7Mt5#AC;fn(1nqv1CtQ-NGeH9`H*@ZP5vHJ9{TJENm1L(&8akb?I z-M&~lP`fMl!h4{XWyd5(K?+EIzQF^*zB|_)XvC2QF07a@QKbu%Q0T=d2}GMoD|HkB z&IkM*DcnaBG3Q=V^~bnYiQ70UP$?0+LjFN3Msojct=$1!?E|KO9uc!Fu;@79mLo3M zDS+ze>IHNREko2!aSOivD``HhB)^vC)32nfvg-faDvkfcZI$-)H7;q4-$h34G_U)dBo9{$R^&J4iGvS3RGQjZgU9F-$ Q&`d;=XLn`ce}?)024@?W*l^R4bJI{ z@)%uJnV6XwIJx+o7}R;!F!06me&;jhQ{fZk3*hVFtL4k%W8?SZ`#RaHz?^Y6&~{f| zKA=+m%-qEERQ;@i)bz=#Yp3%89mod}D#%Nh+Z<50rIA^XO=K%O<9~jG^Nf5acx<>k zxZZGCaJF!~B;hpa{-*lq$vOZ diff --git a/deploy_lt.sh b/deploy_lt.sh new file mode 100755 index 0000000..47912d2 --- /dev/null +++ b/deploy_lt.sh @@ -0,0 +1,285 @@ +#!/bin/bash +set -e + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' + +print_status() { echo -e "${BLUE}[INFO]${NC} $1"; } +print_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; } +print_warning() { echo -e "${YELLOW}[WARNING]${NC} $1"; } +print_error() { echo -e "${RED}[ERROR]${NC} $1"; } + +# Configuration +REMOTE_HOST="laantungir.net" +REMOTE_USER="ubuntu" +REMOTE_DIR="/home/ubuntu/ginxsom" +REMOTE_DB_PATH="/home/ubuntu/ginxsom/db/ginxsom.db" +REMOTE_NGINX_CONFIG="/etc/nginx/conf.d/default.conf" +REMOTE_BINARY_PATH="/home/ubuntu/ginxsom/ginxsom.fcgi" +REMOTE_SOCKET="/tmp/ginxsom-fcgi.sock" +REMOTE_DATA_DIR="/var/www/html/blossom" + +print_status "Starting deployment to $REMOTE_HOST..." + +# Step 1: Build and prepare local binary +print_status "Building ginxsom binary..." +make clean && make +if [[ ! -f "build/ginxsom-fcgi" ]]; then + print_error "Build failed - binary not found" + exit 1 +fi +print_success "Binary built successfully" + +# Step 2: Setup remote environment first (before copying files) +print_status "Setting up remote environment..." +ssh $REMOTE_USER@$REMOTE_HOST << 'EOF' + set -e + + # Create data directory if it doesn't exist (using existing /var/www/html/blossom) + sudo mkdir -p /var/www/html/blossom + sudo chown www-data:www-data /var/www/html/blossom + sudo chmod 755 /var/www/html/blossom + + # Ensure socket directory exists + sudo mkdir -p /tmp + sudo chmod 755 /tmp + + # Install required dependencies + echo "Installing required dependencies..." + sudo apt-get update + sudo apt-get install -y spawn-fcgi libfcgi-dev + + # Stop any existing ginxsom processes + echo "Stopping existing ginxsom processes..." + sudo pkill -f ginxsom-fcgi || true + sudo rm -f /tmp/ginxsom-fcgi.sock || true + + echo "Remote environment setup complete" +EOF + +print_success "Remote environment configured" + +# Step 3: Copy files to remote server +print_status "Copying files to remote server..." + +# Copy entire project directory (excluding unnecessary files) +print_status "Copying entire ginxsom project..." +rsync -avz --exclude='.git' --exclude='build' --exclude='logs' --exclude='Trash' --exclude='blobs' --exclude='db/ginxsom.db' --no-g --no-o --no-perms --omit-dir-times . $REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/ + +# Build on remote server to ensure compatibility +print_status "Building ginxsom on remote server..." +ssh $REMOTE_USER@$REMOTE_HOST "cd $REMOTE_DIR && make clean && make" || { + print_error "Build failed on remote server" + print_status "Checking what packages are actually installed..." + ssh $REMOTE_USER@$REMOTE_HOST "dpkg -l | grep -E '(sqlite|fcgi)'" + exit 1 +} + +# Copy binary to application directory +print_status "Copying ginxsom binary to application directory..." +ssh $REMOTE_USER@$REMOTE_HOST << EOF + # Stop any running process first + sudo pkill -f ginxsom-fcgi || true + sleep 1 + + # Remove old binary if it exists + rm -f $REMOTE_BINARY_PATH + + # Copy new binary + cp $REMOTE_DIR/build/ginxsom-fcgi $REMOTE_BINARY_PATH + chmod +x $REMOTE_BINARY_PATH + chown ubuntu:ubuntu $REMOTE_BINARY_PATH + + echo "Binary copied successfully" +EOF + +# Skip nginx config update - user prefers manual control +print_status "Skipping nginx configuration update (manual control preferred)" + +print_success "Files copied to remote server" + +# Step 3: Setup remote environment +print_status "Setting up remote environment..." + +ssh $REMOTE_USER@$REMOTE_HOST << 'EOF' + set -e + + # Create data directory if it doesn't exist (using existing /var/www/html/blossom) + sudo mkdir -p /var/www/html/blossom + sudo chown www-data:www-data /var/www/html/blossom + sudo chmod 755 /var/www/html/blossom + + # Ensure socket directory exists + sudo mkdir -p /tmp + sudo chmod 755 /tmp + + # Install required dependencies + echo "Installing required dependencies..." + sudo apt-get update 2>/dev/null || true # Continue even if apt update has issues + sudo apt-get install -y spawn-fcgi libfcgi-dev libsqlite3-dev sqlite3 libcurl4-openssl-dev + + # Verify installations + echo "Verifying installations..." + if ! dpkg -l libsqlite3-dev >/dev/null 2>&1; then + echo "libsqlite3-dev not found, trying alternative..." + sudo apt-get install -y libsqlite3-dev || { + echo "Failed to install libsqlite3-dev" + exit 1 + } + fi + if ! dpkg -l libfcgi-dev >/dev/null 2>&1; then + echo "libfcgi-dev not found" + exit 1 + fi + + # Check if sqlite3.h exists + if [ ! -f /usr/include/sqlite3.h ]; then + echo "sqlite3.h not found in /usr/include/" + find /usr -name "sqlite3.h" 2>/dev/null || echo "sqlite3.h not found anywhere" + exit 1 + fi + + # Stop any existing ginxsom processes + echo "Stopping existing ginxsom processes..." + sudo pkill -f ginxsom-fcgi || true + sudo rm -f /tmp/ginxsom-fcgi.sock || true + + echo "Remote environment setup complete" +EOF + +print_success "Remote environment configured" + +# Step 4: Setup database directory and migrate database +print_status "Setting up database directory..." + +ssh $REMOTE_USER@$REMOTE_HOST << EOF + # Create db directory if it doesn't exist + mkdir -p $REMOTE_DIR/db + + # Backup current database if it exists in old location + if [ -f /var/www/html/blossom/ginxsom.db ]; then + echo "Backing up existing database..." + cp /var/www/html/blossom/ginxsom.db /var/www/html/blossom/ginxsom.db.backup.\$(date +%Y%m%d_%H%M%S) + + # Migrate database to new location if not already there + if [ ! -f $REMOTE_DB_PATH ]; then + echo "Migrating database to new location..." + cp /var/www/html/blossom/ginxsom.db $REMOTE_DB_PATH + else + echo "Database already exists at new location" + fi + elif [ ! -f $REMOTE_DB_PATH ]; then + echo "No existing database found - will be created on first run" + else + echo "Database already exists at $REMOTE_DB_PATH" + fi + + # Set proper permissions - www-data needs write access to db directory for SQLite journal files + sudo chown -R www-data:www-data $REMOTE_DIR/db + sudo chmod 755 $REMOTE_DIR/db + sudo chmod 644 $REMOTE_DB_PATH 2>/dev/null || true + + # Allow www-data to access the application directory for spawn-fcgi chdir + chmod 755 $REMOTE_DIR + + echo "Database directory setup complete" +EOF + +print_success "Database directory configured" + +# Step 5: Start ginxsom FastCGI process +print_status "Starting ginxsom FastCGI process..." + +ssh $REMOTE_USER@$REMOTE_HOST << EOF + # Clean up any existing socket + sudo rm -f $REMOTE_SOCKET + + # Start FastCGI process with explicit paths + echo "Starting ginxsom FastCGI with configuration:" + echo " Working directory: $REMOTE_DIR" + echo " Binary: $REMOTE_BINARY_PATH" + echo " Database: $REMOTE_DB_PATH" + echo " Storage: $REMOTE_DATA_DIR" + + sudo spawn-fcgi -M 666 -u www-data -g www-data -s $REMOTE_SOCKET -U www-data -G www-data -d $REMOTE_DIR -- $REMOTE_BINARY_PATH --db-path "$REMOTE_DB_PATH" --storage-dir "$REMOTE_DATA_DIR" + + # Give it a moment to start + sleep 2 + + # Verify process is running + if pgrep -f "ginxsom-fcgi" > /dev/null; then + echo "FastCGI process started successfully" + echo "PID: \$(pgrep -f ginxsom-fcgi)" + else + echo "Process not found by pgrep, but socket exists - this may be normal for FastCGI" + echo "Checking socket..." + ls -la $REMOTE_SOCKET + echo "Checking if binary exists and is executable..." + ls -la $REMOTE_BINARY_PATH + echo "Testing if we can connect to the socket..." + # Try to test the FastCGI connection + if command -v cgi-fcgi >/dev/null 2>&1; then + echo "Testing FastCGI connection..." + SCRIPT_NAME=/health SCRIPT_FILENAME=$REMOTE_BINARY_PATH REQUEST_METHOD=GET cgi-fcgi -bind -connect $REMOTE_SOCKET 2>/dev/null | head -5 || echo "Connection test failed" + else + echo "cgi-fcgi not available for testing" + fi + # Don't exit - the socket existing means spawn-fcgi worked + fi +EOF + +if [ $? -eq 0 ]; then + print_success "FastCGI process started" +else + print_error "Failed to start FastCGI process" + exit 1 +fi + +# Step 6: Test nginx configuration and reload +print_status "Testing and reloading nginx..." + +ssh $REMOTE_USER@$REMOTE_HOST << 'EOF' + # Test nginx configuration + if sudo nginx -t; then + echo "Nginx configuration test passed" + sudo nginx -s reload + echo "Nginx reloaded successfully" + else + echo "Nginx configuration test failed" + exit 1 + fi +EOF + +print_success "Nginx reloaded" + +# Step 7: Test deployment +print_status "Testing deployment..." + +# Test health endpoint +echo "Testing health endpoint..." +if curl -k -s --max-time 10 "https://blossom.laantungir.net/health" | grep -q "OK"; then + print_success "Health check passed" +else + print_warning "Health check failed - checking response..." + curl -k -v --max-time 10 "https://blossom.laantungir.net/health" 2>&1 | head -10 +fi + +# Test basic endpoints +echo "Testing root endpoint..." +if curl -k -s --max-time 10 "https://blossom.laantungir.net/" | grep -q "Ginxsom"; then + print_success "Root endpoint responding" +else + print_warning "Root endpoint not responding as expected - checking response..." + curl -k -v --max-time 10 "https://blossom.laantungir.net/" 2>&1 | head -10 +fi + +print_success "Deployment to $REMOTE_HOST completed!" +print_status "Ginxsom should now be available at: https://blossom.laantungir.net" +print_status "Test endpoints:" +echo " Health: curl -k https://blossom.laantungir.net/health" +echo " Root: curl -k https://blossom.laantungir.net/" +echo " List: curl -k https://blossom.laantungir.net/list" \ No newline at end of file diff --git a/docs/PRODUCTION_MIGRATION_PLAN.md b/docs/PRODUCTION_MIGRATION_PLAN.md new file mode 100644 index 0000000..31694bd --- /dev/null +++ b/docs/PRODUCTION_MIGRATION_PLAN.md @@ -0,0 +1,356 @@ +# Production Directory Structure Migration Plan + +## Overview + +This document outlines the plan to migrate the ginxsom production deployment from the current configuration to a new, more organized directory structure. + +## Current Configuration (As-Is) + +``` +Binary Location: /var/www/html/blossom/ginxsom.fcgi +Database Location: /var/www/html/blossom/ginxsom.db +Data Directory: /var/www/html/blossom/ +Working Directory: /var/www/html/blossom/ (set via spawn-fcgi -d) +Socket: /tmp/ginxsom-fcgi.sock +``` + +**Issues with Current Setup:** +1. Binary and database mixed with data files in web-accessible directory +2. Database path hardcoded as relative path `db/ginxsom.db` but database is at root of working directory +3. No separation between application files and user data +4. Security concern: application files in web root + +## Target Configuration (To-Be) + +``` +Binary Location: /home/ubuntu/ginxsom/ginxsom.fcgi +Database Location: /home/ubuntu/ginxsom/db/ginxsom.db +Data Directory: /var/www/html/blossom/ +Working Directory: /home/ubuntu/ginxsom/ (set via spawn-fcgi -d) +Socket: /tmp/ginxsom-fcgi.sock +``` + +**Benefits of New Setup:** +1. Application files separated from user data +2. Database in proper subdirectory structure +3. Application files outside web root (better security) +4. Clear separation of concerns +5. Easier backup and maintenance + +## Directory Structure + +### Application Directory: `/home/ubuntu/ginxsom/` +``` +/home/ubuntu/ginxsom/ +├── ginxsom.fcgi # FastCGI binary +├── db/ +│ └── ginxsom.db # SQLite database +├── build/ # Build artifacts (from rsync) +├── src/ # Source code (from rsync) +├── include/ # Headers (from rsync) +├── config/ # Config files (from rsync) +└── scripts/ # Utility scripts (from rsync) +``` + +### Data Directory: `/var/www/html/blossom/` +``` +/var/www/html/blossom/ +├── .jpg # User uploaded files +├── .png +├── .mp4 +└── ... +``` + +## Command-Line Arguments + +The ginxsom binary supports these arguments (from [`src/main.c`](src/main.c:1488-1509)): + +```bash +--db-path PATH # Database file path (default: db/ginxsom.db) +--storage-dir DIR # Storage directory for files (default: .) +--help, -h # Show help message +``` + +## Migration Steps + +### 1. Update deploy_lt.sh Configuration + +Update the configuration variables in [`deploy_lt.sh`](deploy_lt.sh:16-23): + +```bash +# Configuration +REMOTE_HOST="laantungir.net" +REMOTE_USER="ubuntu" +REMOTE_DIR="/home/ubuntu/ginxsom" +REMOTE_DB_PATH="/home/ubuntu/ginxsom/db/ginxsom.db" +REMOTE_NGINX_CONFIG="/etc/nginx/conf.d/default.conf" +REMOTE_BINARY_PATH="/home/ubuntu/ginxsom/ginxsom.fcgi" +REMOTE_SOCKET="/tmp/ginxsom-fcgi.sock" +REMOTE_DATA_DIR="/var/www/html/blossom" +``` + +### 2. Update Binary Deployment + +Modify the binary copy section (lines 82-97) to use new path: + +```bash +# Copy binary to application directory (not web directory) +print_status "Copying ginxsom binary to application directory..." +ssh $REMOTE_USER@$REMOTE_HOST << EOF + # Stop any running process first + sudo pkill -f ginxsom-fcgi || true + sleep 1 + + # Remove old binary if it exists + rm -f $REMOTE_BINARY_PATH + + # Copy new binary + cp $REMOTE_DIR/build/ginxsom-fcgi $REMOTE_BINARY_PATH + chmod +x $REMOTE_BINARY_PATH + chown ubuntu:ubuntu $REMOTE_BINARY_PATH + + echo "Binary copied successfully" +EOF +``` + +### 3. Create Database Directory Structure + +Add database setup before starting FastCGI: + +```bash +# Setup database directory +print_status "Setting up database directory..." +ssh $REMOTE_USER@$REMOTE_HOST << EOF + # Create db directory if it doesn't exist + mkdir -p $REMOTE_DIR/db + + # Copy database if it exists in old location + if [ -f /var/www/html/blossom/ginxsom.db ]; then + echo "Migrating database from old location..." + cp /var/www/html/blossom/ginxsom.db $REMOTE_DB_PATH + elif [ ! -f $REMOTE_DB_PATH ]; then + echo "Initializing new database..." + # Database will be created by application on first run + fi + + # Set proper permissions + chown -R ubuntu:ubuntu $REMOTE_DIR/db + chmod 755 $REMOTE_DIR/db + chmod 644 $REMOTE_DB_PATH 2>/dev/null || true + + echo "Database directory setup complete" +EOF +``` + +### 4. Update spawn-fcgi Command + +Modify the FastCGI startup (line 164) to include command-line arguments: + +```bash +# Start FastCGI process with explicit paths +echo "Starting ginxsom FastCGI..." +sudo spawn-fcgi \ + -M 666 \ + -u www-data \ + -g www-data \ + -s $REMOTE_SOCKET \ + -U www-data \ + -G www-data \ + -d $REMOTE_DIR \ + -- $REMOTE_BINARY_PATH \ + --db-path "$REMOTE_DB_PATH" \ + --storage-dir "$REMOTE_DATA_DIR" +``` + +**Key Changes:** +- `-d $REMOTE_DIR`: Sets working directory to `/home/ubuntu/ginxsom/` +- `--db-path "$REMOTE_DB_PATH"`: Explicit database path +- `--storage-dir "$REMOTE_DATA_DIR"`: Explicit data directory + +### 5. Verify Permissions + +Ensure proper permissions for all directories: + +```bash +# Application directory - owned by ubuntu +sudo chown -R ubuntu:ubuntu /home/ubuntu/ginxsom +sudo chmod 755 /home/ubuntu/ginxsom +sudo chmod +x /home/ubuntu/ginxsom/ginxsom.fcgi + +# Database directory - readable by www-data +sudo chmod 755 /home/ubuntu/ginxsom/db +sudo chmod 644 /home/ubuntu/ginxsom/db/ginxsom.db + +# Data directory - writable by www-data +sudo chown -R www-data:www-data /var/www/html/blossom +sudo chmod 755 /var/www/html/blossom +``` + +## Path Resolution Logic + +### How Paths Work with spawn-fcgi -d Option + +When spawn-fcgi starts the FastCGI process: + +1. **Working Directory**: Set to `/home/ubuntu/ginxsom/` via `-d` option +2. **Relative Paths**: Resolved from working directory +3. **Absolute Paths**: Used as-is + +### Default Behavior (Without Arguments) + +From [`src/main.c`](src/main.c:30-31): +```c +char g_db_path[MAX_PATH_LEN] = "db/ginxsom.db"; // Relative to working dir +char g_storage_dir[MAX_PATH_LEN] = "."; // Current working dir +``` + +With working directory `/home/ubuntu/ginxsom/`: +- Database: `/home/ubuntu/ginxsom/db/ginxsom.db` ✓ +- Storage: `/home/ubuntu/ginxsom/` ✗ (wrong - we want `/var/www/html/blossom/`) + +### With Command-Line Arguments + +```bash +--db-path "/home/ubuntu/ginxsom/db/ginxsom.db" +--storage-dir "/var/www/html/blossom" +``` + +Result: +- Database: `/home/ubuntu/ginxsom/db/ginxsom.db` ✓ +- Storage: `/var/www/html/blossom/` ✓ + +## Testing Plan + +### 1. Pre-Migration Verification +```bash +# Check current setup +ssh ubuntu@laantungir.net " + echo 'Current binary location:' + ls -la /var/www/html/blossom/ginxsom.fcgi + + echo 'Current database location:' + ls -la /var/www/html/blossom/ginxsom.db + + echo 'Current process:' + ps aux | grep ginxsom-fcgi | grep -v grep +" +``` + +### 2. Post-Migration Verification +```bash +# Check new setup +ssh ubuntu@laantungir.net " + echo 'New binary location:' + ls -la /home/ubuntu/ginxsom/ginxsom.fcgi + + echo 'New database location:' + ls -la /home/ubuntu/ginxsom/db/ginxsom.db + + echo 'Data directory:' + ls -la /var/www/html/blossom/ | head -10 + + echo 'Process working directory:' + sudo ls -la /proc/\$(pgrep -f ginxsom.fcgi)/cwd + + echo 'Process command line:' + ps aux | grep ginxsom-fcgi | grep -v grep +" +``` + +### 3. Functional Testing +```bash +# Test health endpoint +curl -k https://blossom.laantungir.net/health + +# Test file upload +./tests/file_put_production.sh + +# Test file retrieval +curl -k -I https://blossom.laantungir.net/ + +# Test list endpoint +curl -k https://blossom.laantungir.net/list/ +``` + +## Rollback Plan + +If migration fails: + +1. **Stop new process:** + ```bash + sudo pkill -f ginxsom-fcgi + ``` + +2. **Restore old binary location:** + ```bash + sudo cp /home/ubuntu/ginxsom/build/ginxsom-fcgi /var/www/html/blossom/ginxsom.fcgi + sudo chown www-data:www-data /var/www/html/blossom/ginxsom.fcgi + ``` + +3. **Restart with old configuration:** + ```bash + sudo spawn-fcgi -M 666 -u www-data -g www-data \ + -s /tmp/ginxsom-fcgi.sock \ + -U www-data -G www-data \ + -d /var/www/html/blossom \ + /var/www/html/blossom/ginxsom.fcgi + ``` + +## Additional Considerations + +### 1. Database Backup +Before migration, backup the current database: +```bash +ssh ubuntu@laantungir.net " + cp /var/www/html/blossom/ginxsom.db /var/www/html/blossom/ginxsom.db.backup +" +``` + +### 2. NIP-94 Origin Configuration +After migration, update [`src/bud08.c`](src/bud08.c) to return production domain: +```c +void nip94_get_origin(char *origin, size_t origin_size) { + snprintf(origin, origin_size, "https://blossom.laantungir.net"); +} +``` + +### 3. Monitoring +Monitor logs after migration: +```bash +# Application logs +ssh ubuntu@laantungir.net "sudo journalctl -u nginx -f" + +# FastCGI process +ssh ubuntu@laantungir.net "ps aux | grep ginxsom-fcgi" +``` + +## Success Criteria + +Migration is successful when: + +1. ✓ Binary running from `/home/ubuntu/ginxsom/ginxsom.fcgi` +2. ✓ Database accessible at `/home/ubuntu/ginxsom/db/ginxsom.db` +3. ✓ Files stored in `/var/www/html/blossom/` +4. ✓ Health endpoint returns 200 OK +5. ✓ File upload works correctly +6. ✓ File retrieval works correctly +7. ✓ Database queries succeed +8. ✓ No permission errors in logs + +## Timeline + +1. **Preparation**: Update deploy_lt.sh script (15 minutes) +2. **Backup**: Backup current database (5 minutes) +3. **Migration**: Run updated deployment script (10 minutes) +4. **Testing**: Verify all endpoints (15 minutes) +5. **Monitoring**: Watch for issues (30 minutes) + +**Total Estimated Time**: ~75 minutes + +## References + +- Current deployment script: [`deploy_lt.sh`](deploy_lt.sh) +- Main application: [`src/main.c`](src/main.c) +- Command-line parsing: [`src/main.c:1488-1509`](src/main.c:1488-1509) +- Global configuration: [`src/main.c:30-31`](src/main.c:30-31) +- Database operations: [`src/main.c:333-385`](src/main.c:333-385) \ No newline at end of file diff --git a/include/ginxsom.h b/include/ginxsom.h index 89a3153..898de87 100644 --- a/include/ginxsom.h +++ b/include/ginxsom.h @@ -33,6 +33,10 @@ #define DEFAULT_MAX_BLOBS_PER_USER 1000 #define DEFAULT_RATE_LIMIT 10 +/* Global configuration variables */ +extern char g_db_path[MAX_PATH_LEN]; +extern char g_storage_dir[MAX_PATH_LEN]; + /* Error codes */ typedef enum { GINXSOM_OK = 0, diff --git a/remote.nginx.config b/remote.nginx.config new file mode 100644 index 0000000..d58d213 --- /dev/null +++ b/remote.nginx.config @@ -0,0 +1,376 @@ +# FastCGI upstream configuration +upstream ginxsom_backend { + server unix:/tmp/ginxsom-fcgi.sock; +} + +# Main domains +server { + if ($host = laantungir.net) { + return 301 https://$host$request_uri; + } # managed by Certbot + + + listen 80; + server_name laantungir.com www.laantungir.com laantungir.net www.laantungir.net laantungir.org www.laantungir.org; + + root /var/www/html; + index index.html index.htm; + + location / { + try_files $uri $uri/ =404; + } + + location /.well-known/acme-challenge/ { + root /var/www/certbot; + } + + error_page 404 /404.html; + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /var/www/html; + } + + +} + +# Main domains HTTPS - using the main certificate +server { + listen 443 ssl; + server_name laantungir.com www.laantungir.com laantungir.net www.laantungir.net laantungir.org www.laantungir.org; + ssl_certificate /etc/letsencrypt/live/laantungir.net/fullchain.pem; # managed by Certbot + ssl_certificate_key /etc/letsencrypt/live/laantungir.net/privkey.pem; # managed by Certbot + + root /var/www/html; + index index.html index.htm; + + location / { + try_files $uri $uri/ =404; + } + + error_page 404 /404.html; + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /var/www/html; + } + +} + +# Blossom subdomains HTTP - redirect to HTTPS (keep for ACME) +server { + listen 80; + server_name blossom.laantungir.com blossom.laantungir.net blossom.laantungir.org; + + location /.well-known/acme-challenge/ { + root /var/www/certbot; + } + + location / { + return 301 https://$server_name$request_uri; + } +} + +# Blossom subdomains HTTPS - ginxsom FastCGI +server { + listen 443 ssl; + server_name blossom.laantungir.com blossom.laantungir.net blossom.laantungir.org; + + ssl_certificate /etc/letsencrypt/live/git.laantungir.net/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/git.laantungir.net/privkey.pem; + + # Security headers + add_header X-Content-Type-Options nosniff always; + add_header X-Frame-Options DENY always; + add_header X-XSS-Protection "1; mode=block" always; + + # CORS for Blossom protocol + add_header Access-Control-Allow-Origin * always; + add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, HEAD, OPTIONS, PATCH" always; + add_header Access-Control-Allow-Headers "Authorization, Content-Type, Content-Length, Accept, Origin, User-Agent, DNT, Cache-Control, X-Mx-ReqToken, Keep-Alive, X-Requested-With, If-Modified-Since, *" always; + add_header Access-Control-Max-Age 86400 always; + + # Root directory for blob storage + root /var/www/html/blossom; + + # Maximum upload size + client_max_body_size 100M; + + # OPTIONS preflight handler + if ($request_method = OPTIONS) { + return 204; + } + + # PUT /upload - File uploads + location = /upload { + if ($request_method !~ ^(PUT|HEAD)$) { + return 405; + } + fastcgi_pass ginxsom_backend; + include fastcgi_params; + fastcgi_param SCRIPT_FILENAME $document_root/ginxsom.fcgi; + } + + # GET /list/ - List user blobs + location ~ "^/list/([a-f0-9]{64})$" { + if ($request_method !~ ^(GET)$) { + return 405; + } + fastcgi_pass ginxsom_backend; + include fastcgi_params; + fastcgi_param SCRIPT_FILENAME $document_root/ginxsom.fcgi; + } + + # PUT /mirror - Mirror content + location = /mirror { + if ($request_method !~ ^(PUT)$) { + return 405; + } + fastcgi_pass ginxsom_backend; + include fastcgi_params; + fastcgi_param SCRIPT_FILENAME $document_root/ginxsom.fcgi; + } + + # PUT /report - Report content + location = /report { + if ($request_method !~ ^(PUT)$) { + return 405; + } + fastcgi_pass ginxsom_backend; + include fastcgi_params; + fastcgi_param SCRIPT_FILENAME $document_root/ginxsom.fcgi; + } + + # GET /auth - NIP-42 challenges + location = /auth { + if ($request_method !~ ^(GET)$) { + return 405; + } + fastcgi_pass ginxsom_backend; + include fastcgi_params; + fastcgi_param SCRIPT_FILENAME $document_root/ginxsom.fcgi; + } + + # Admin API + location /api/ { + if ($request_method !~ ^(GET|PUT)$) { + return 405; + } + fastcgi_pass ginxsom_backend; + include fastcgi_params; + fastcgi_param SCRIPT_FILENAME $document_root/ginxsom.fcgi; + } + + # Blob serving - SHA256 patterns + location ~ "^/([a-f0-9]{64})(\.[a-zA-Z0-9]+)?$" { + # Handle DELETE via rewrite + if ($request_method = DELETE) { + rewrite ^/(.*)$ /fcgi-delete/$1 last; + } + + # Route HEAD to FastCGI + if ($request_method = HEAD) { + rewrite ^/(.*)$ /fcgi-head/$1 last; + } + + # GET requests - serve files directly + if ($request_method != GET) { + return 405; + } + + try_files /$1.txt /$1.jpg /$1.jpeg /$1.png /$1.webp /$1.gif /$1.pdf /$1.mp4 /$1.mp3 /$1.md =404; + + # Cache headers + add_header Cache-Control "public, max-age=31536000, immutable"; + } + + # Internal FastCGI handlers + location ~ "^/fcgi-delete/([a-f0-9]{64}).*$" { + internal; + fastcgi_pass ginxsom_backend; + include fastcgi_params; + fastcgi_param SCRIPT_FILENAME $document_root/ginxsom.fcgi; + fastcgi_param REQUEST_URI /$1; + } + + location ~ "^/fcgi-head/([a-f0-9]{64}).*$" { + internal; + fastcgi_pass ginxsom_backend; + include fastcgi_params; + fastcgi_param SCRIPT_FILENAME $document_root/ginxsom.fcgi; + fastcgi_param REQUEST_URI /$1; + } + + # Health check + location /health { + access_log off; + return 200 "OK\n"; + add_header Content-Type text/plain; + add_header Access-Control-Allow-Origin * always; + add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, HEAD, OPTIONS, PATCH" always; + add_header Access-Control-Allow-Headers "Authorization, Content-Type, Content-Length, Accept, Origin, User-Agent, DNT, Cache-Control, X-Mx-ReqToken, Keep-Alive, X-Requested-With, If-Modified-Since, *" always; + add_header Access-Control-Max-Age 86400 always; + } + + # Default location - Server info endpoint + location / { + return 200 '{\n "server": "ginxsom",\n "version": "1.0.0",\n "description": "Ginxsom Blossom Server",\n "endpoints": {\n "blob_get": "GET /",\n "blob_head": "HEAD /",\n "upload": "PUT /upload",\n "upload_requirements": "HEAD /upload",\n "list": "GET /list/",\n "delete": "DELETE /",\n "mirror": "PUT /mirror",\n "report": "PUT /report",\n "health": "GET /health"\n },\n "supported_buds": [\n "BUD-01",\n "BUD-02",\n "BUD-04",\n "BUD-06",\n "BUD-08",\n "BUD-09"\n ],\n "limits": {\n "max_upload_size": 104857600,\n "supported_mime_types": [\n "image/jpeg",\n "image/png",\n "image/webp",\n "image/gif",\n "video/mp4",\n "video/webm",\n "audio/mpeg",\n "audio/ogg",\n "text/plain",\n "application/pdf"\n ]\n },\n "authentication": {\n "required_for_upload": false,\n "required_for_delete": true,\n "required_for_list": false,\n "nip42_enabled": true\n }\n}'; + add_header Content-Type application/json; + add_header Access-Control-Allow-Origin * always; + add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, HEAD, OPTIONS, PATCH" always; + add_header Access-Control-Allow-Headers "Authorization, Content-Type, Content-Length, Accept, Origin, User-Agent, DNT, Cache-Control, X-Mx-ReqToken, Keep-Alive, X-Requested-With, If-Modified-Since, *" always; + add_header Access-Control-Max-Age 86400 always; + } +} + +server { + listen 80; + server_name relay.laantungir.com relay.laantungir.net relay.laantungir.org; + + location /.well-known/acme-challenge/ { + root /var/www/certbot; + } + + location / { + proxy_pass http://127.0.0.1:8888; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + proxy_set_header Host $host; + proxy_set_header Sec-WebSocket-Key $http_sec_websocket_key; + proxy_set_header Sec-WebSocket-Version $http_sec_websocket_version; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_cache_bypass $http_upgrade; + proxy_read_timeout 86400s; + proxy_send_timeout 86400s; + proxy_connect_timeout 60s; + proxy_buffering off; + proxy_request_buffering off; + gzip off; + } +} + + +# # Relay HTTPS - proxy to c-relay +server { + listen 443 ssl; + server_name relay.laantungir.com relay.laantungir.net relay.laantungir.org; + + ssl_certificate /etc/letsencrypt/live/blossom.laantungir.net/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/blossom.laantungir.net/privkey.pem; + + location / { + proxy_pass http://127.0.0.1:8888; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + proxy_set_header Host $host; + proxy_set_header Sec-WebSocket-Key $http_sec_websocket_key; + proxy_set_header Sec-WebSocket-Version $http_sec_websocket_version; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_cache_bypass $http_upgrade; + proxy_read_timeout 86400s; + proxy_send_timeout 86400s; + proxy_connect_timeout 60s; + proxy_buffering off; + proxy_request_buffering off; + gzip off; + } +} + + + + # Git subdomains HTTP - redirect to HTTPS + server { + listen 80; + server_name git.laantungir.com git.laantungir.net git.laantungir.org; + + # Allow larger file uploads for Git releases + client_max_body_size 50M; + + location /.well-known/acme-challenge/ { + root /var/www/certbot; + } + + location / { + return 301 https://$server_name$request_uri; + } + } + + # Auth subdomains HTTP - redirect to HTTPS + server { + listen 80; + server_name auth.laantungir.com auth.laantungir.net auth.laantungir.org; + + location /.well-known/acme-challenge/ { + root /var/www/certbot; + } + + location / { + } + } + + # Git subdomains HTTPS - proxy to gitea + server { + listen 443 ssl; + server_name git.laantungir.com git.laantungir.net git.laantungir.org; + + # Allow larger file uploads for Git releases + client_max_body_size 50M; + + ssl_certificate /etc/letsencrypt/live/git.laantungir.net/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/git.laantungir.net/privkey.pem; + + location / { + proxy_pass http://localhost:3000; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + proxy_buffering off; + proxy_request_buffering off; + proxy_read_timeout 86400s; + proxy_send_timeout 86400s; + proxy_connect_timeout 60s; + gzip off; + # proxy_set_header Sec-WebSocket-Extensions ; + proxy_set_header Host $host; + proxy_set_header Sec-WebSocket-Key $http_sec_websocket_key; + proxy_set_header Sec-WebSocket-Version $http_sec_websocket_version; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_cache_bypass $http_upgrade; + } + } + + # Auth subdomains HTTPS - proxy to nostr-auth + server { + listen 443 ssl; + server_name auth.laantungir.com auth.laantungir.net auth.laantungir.org; + + ssl_certificate /etc/letsencrypt/live/git.laantungir.net/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/git.laantungir.net/privkey.pem; + + location / { + proxy_pass http://localhost:3001; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + proxy_buffering off; + proxy_request_buffering off; + proxy_read_timeout 86400s; + proxy_send_timeout 86400s; + proxy_connect_timeout 60s; + gzip off; + # proxy_set_header Sec-WebSocket-Extensions ; + proxy_set_header Host $host; + proxy_set_header Sec-WebSocket-Key $http_sec_websocket_key; + proxy_set_header Sec-WebSocket-Version $http_sec_websocket_version; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_cache_bypass $http_upgrade; + } + } diff --git a/restart-all.sh b/restart-all.sh index 65de34d..8f4fd3a 100755 --- a/restart-all.sh +++ b/restart-all.sh @@ -168,7 +168,7 @@ export GINX_DEBUG=1 # Start FastCGI application with proper logging (daemonized but with redirected streams) echo "FastCGI starting at $(date)" >> logs/app/stderr.log -spawn-fcgi -s "$SOCKET_PATH" -M 666 -u "$USER" -g "$USER" -f "$FCGI_BINARY" -P "$PID_FILE" 1>>logs/app/stdout.log 2>>logs/app/stderr.log +spawn-fcgi -s "$SOCKET_PATH" -M 666 -u "$USER" -g "$USER" -P "$PID_FILE" -- "$FCGI_BINARY" --storage-dir blobs 1>>logs/app/stdout.log 2>>logs/app/stderr.log if [ $? -eq 0 ] && [ -f "$PID_FILE" ]; then PID=$(cat "$PID_FILE") @@ -250,6 +250,8 @@ else fi echo -e "\n${GREEN}=== Restart sequence complete ===${NC}" -echo -e "${YELLOW}Server should be available at: http://localhost:9001${NC}" echo -e "${YELLOW}To stop all processes, run: nginx -p . -c $NGINX_CONFIG -s stop && kill \$(cat $PID_FILE 2>/dev/null)${NC}" -echo -e "${YELLOW}To monitor logs, check: logs/error.log, logs/access.log, and logs/fcgi-stderr.log${NC}" \ No newline at end of file +echo -e "${YELLOW}To monitor logs, check: logs/nginx/error.log, logs/nginx/access.log, logs/app/stderr.log, logs/app/stdout.log${NC}" +echo -e "\n${YELLOW}Server is available at:${NC}" +echo -e " ${GREEN}HTTP:${NC} http://localhost:9001" +echo -e " ${GREEN}HTTPS:${NC} https://localhost:9443" \ No newline at end of file diff --git a/src/bud04.c b/src/bud04.c index da24c18..5c13d19 100644 --- a/src/bud04.c +++ b/src/bud04.c @@ -426,9 +426,9 @@ void handle_mirror_request(void) { // Determine file extension from Content-Type using centralized mapping const char* extension = mime_to_extension(content_type_final); - // Save file to blobs directory + // Save file to storage directory using global g_storage_dir variable char filepath[512]; - snprintf(filepath, sizeof(filepath), "blobs/%s%s", sha256_hex, extension); + snprintf(filepath, sizeof(filepath), "%s/%s%s", g_storage_dir, sha256_hex, extension); FILE* outfile = fopen(filepath, "wb"); if (!outfile) { diff --git a/src/bud08.c b/src/bud08.c index 3be9603..a5ba3ac 100644 --- a/src/bud08.c +++ b/src/bud08.c @@ -24,7 +24,7 @@ int nip94_is_enabled(void) { return 1; // Default enabled on DB error } - const char* sql = "SELECT value FROM server_config WHERE key = 'nip94_enabled'"; + const char* sql = "SELECT value FROM config WHERE key = 'nip94_enabled'"; rc = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); if (rc == SQLITE_OK) { rc = sqlite3_step(stmt); @@ -45,49 +45,52 @@ int nip94_get_origin(char* out, size_t out_size) { return 0; } - // Check if request came over HTTPS (nginx sets HTTPS=on for SSL requests) - const char* https_env = getenv("HTTPS"); - if (https_env && strcmp(https_env, "on") == 0) { - // HTTPS request - use HTTPS origin - strncpy(out, "https://localhost:9443", out_size - 1); - out[out_size - 1] = '\0'; - return 1; - } - - // HTTP request - check database config first, then use HTTP origin + // Check database config first for custom origin sqlite3* db; sqlite3_stmt* stmt; int rc; rc = sqlite3_open_v2(DB_PATH, &db, SQLITE_OPEN_READONLY, NULL); - if (rc) { - // Default on DB error - use HTTP - strncpy(out, "http://localhost:9001", out_size - 1); - out[out_size - 1] = '\0'; + if (rc == SQLITE_OK) { + const char* sql = "SELECT value FROM config WHERE key = 'cdn_origin'"; + rc = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); + if (rc == SQLITE_OK) { + rc = sqlite3_step(stmt); + if (rc == SQLITE_ROW) { + const char* value = (const char*)sqlite3_column_text(stmt, 0); + if (value) { + strncpy(out, value, out_size - 1); + out[out_size - 1] = '\0'; + sqlite3_finalize(stmt); + sqlite3_close(db); + return 1; + } + } + sqlite3_finalize(stmt); + } + sqlite3_close(db); + } + + // Check if request came over HTTPS (nginx sets HTTPS=on for SSL requests) + const char* https_env = getenv("HTTPS"); + const char* server_name = getenv("SERVER_NAME"); + + // Use production domain if SERVER_NAME is set and not localhost + if (server_name && strcmp(server_name, "localhost") != 0) { + if (https_env && strcmp(https_env, "on") == 0) { + snprintf(out, out_size, "https://%s", server_name); + } else { + snprintf(out, out_size, "http://%s", server_name); + } return 1; } - - const char* sql = "SELECT value FROM server_config WHERE key = 'cdn_origin'"; - rc = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); - if (rc == SQLITE_OK) { - rc = sqlite3_step(stmt); - if (rc == SQLITE_ROW) { - const char* value = (const char*)sqlite3_column_text(stmt, 0); - if (value) { - strncpy(out, value, out_size - 1); - out[out_size - 1] = '\0'; - sqlite3_finalize(stmt); - sqlite3_close(db); - return 1; - } - } - sqlite3_finalize(stmt); + + // Fallback to localhost for development + if (https_env && strcmp(https_env, "on") == 0) { + strncpy(out, "https://localhost:9443", out_size - 1); + } else { + strncpy(out, "http://localhost:9001", out_size - 1); } - - sqlite3_close(db); - - // Default fallback - HTTP - strncpy(out, "http://localhost:9001", out_size - 1); out[out_size - 1] = '\0'; return 1; } diff --git a/src/ginxsom.h b/src/ginxsom.h index 9191df0..fa44b21 100644 --- a/src/ginxsom.h +++ b/src/ginxsom.h @@ -30,6 +30,10 @@ extern sqlite3* db; int init_database(void); void close_database(void); +// Global configuration variables (defined in main.c) +extern char g_db_path[4096]; +extern char g_storage_dir[4096]; + // SHA-256 extraction and validation const char* extract_sha256_from_uri(const char* uri); diff --git a/src/main.c b/src/main.c index d4a1424..0c63c03 100644 --- a/src/main.c +++ b/src/main.c @@ -7,6 +7,7 @@ #include "ginxsom.h" #include "../nostr_core_lib/nostr_core/nostr_common.h" #include "../nostr_core_lib/nostr_core/utils.h" +#include #include #include #include @@ -22,11 +23,15 @@ // Debug macros removed #define MAX_SHA256_LEN 65 -#define MAX_PATH_LEN 512 +#define MAX_PATH_LEN 4096 #define MAX_MIME_LEN 128 -// Database path -#define DB_PATH "db/ginxsom.db" +// Configuration variables - can be overridden via command line +char g_db_path[MAX_PATH_LEN] = "db/ginxsom.db"; +char g_storage_dir[MAX_PATH_LEN] = "."; + +// Use global configuration variables +#define DB_PATH g_db_path // Configuration system implementation @@ -35,22 +40,6 @@ #include #include -// ===== UNUSED CODE - SAFE TO REMOVE AFTER TESTING ===== -// Server configuration structure -/* -typedef struct { - char admin_pubkey[256]; - char admin_enabled[8]; - int config_loaded; -} server_config_t; - -// Global configuration instance -static server_config_t g_server_config = {0}; - -// Global server private key (stored in memory only for security) -static char server_private_key[128] = {0}; -*/ -// ===== END UNUSED CODE ===== // Function to get XDG config directory const char *get_config_dir(char *buffer, size_t buffer_size) { @@ -70,240 +59,6 @@ const char *get_config_dir(char *buffer, size_t buffer_size) { return ".config/ginxsom"; } -/* -// ===== UNUSED CODE - SAFE TO REMOVE AFTER TESTING ===== -// Load server configuration from database or create defaults -int initialize_server_config(void) { - sqlite3 *db = NULL; - sqlite3_stmt *stmt = NULL; - int rc; - - memset(&g_server_config, 0, sizeof(g_server_config)); - - // Open database - rc = sqlite3_open_v2(DB_PATH, &db, SQLITE_OPEN_READONLY, NULL); - if (rc != SQLITE_OK) { - fprintf(stderr, "CONFIG: Could not open database for config: %s\n", - sqlite3_errmsg(db)); - // Config database doesn't exist - leave config uninitialized - g_server_config.config_loaded = 0; - return 0; - } - - // Load admin_pubkey - const char *sql = "SELECT value FROM config WHERE key = ?"; - rc = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); - if (rc == SQLITE_OK) { - sqlite3_bind_text(stmt, 1, "admin_pubkey", -1, SQLITE_STATIC); - rc = sqlite3_step(stmt); - if (rc == SQLITE_ROW) { - const char *value = (const char *)sqlite3_column_text(stmt, 0); - if (value) { - strncpy(g_server_config.admin_pubkey, value, - sizeof(g_server_config.admin_pubkey) - 1); - } - } - sqlite3_finalize(stmt); - } - - // Load admin_enabled - rc = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); - if (rc == SQLITE_OK) { - sqlite3_bind_text(stmt, 1, "admin_enabled", -1, SQLITE_STATIC); - rc = sqlite3_step(stmt); - if (rc == SQLITE_ROW) { - const char *value = (const char *)sqlite3_column_text(stmt, 0); - if (value && strcmp(value, "true") == 0) { - strcpy(g_server_config.admin_enabled, "true"); - } else { - strcpy(g_server_config.admin_enabled, "false"); - } - } - sqlite3_finalize(stmt); - } - - sqlite3_close(db); - - g_server_config.config_loaded = 1; - fprintf(stderr, "CONFIG: Server configuration loaded\n"); - return 1; -} -// ===== END UNUSED CODE ===== -*/ - -/* -// File-based configuration system -// Config file path resolution -int get_config_file_path(char *path, size_t path_size) { - const char *home = getenv("HOME"); - const char *xdg_config = getenv("XDG_CONFIG_HOME"); - - if (xdg_config) { - snprintf(path, path_size, "%s/ginxsom/ginxsom_config_event.json", - xdg_config); - } else if (home) { - snprintf(path, path_size, "%s/.config/ginxsom/ginxsom_config_event.json", - home); - } else { - return 0; - } - return 1; -} -*/ - -/* -// Load and validate config event -int load_server_config(const char *config_path) { - FILE *file = fopen(config_path, "r"); - if (!file) { - return 0; // Config file doesn't exist - } - - // Read entire file - fseek(file, 0, SEEK_END); - long file_size = ftell(file); - fseek(file, 0, SEEK_SET); - - char *json_data = malloc(file_size + 1); - if (!json_data) { - fclose(file); - return 0; - } - - fread(json_data, 1, file_size, file); - json_data[file_size] = '\0'; - fclose(file); - - // Parse and validate JSON event - cJSON *event = cJSON_Parse(json_data); - free(json_data); - - if (!event) { - fprintf(stderr, "Invalid JSON in config file\n"); - return 0; - } - - // Validate event structure and signature - if (nostr_validate_event(event) != NOSTR_SUCCESS) { - fprintf(stderr, "Invalid or corrupted config event\n"); - cJSON_Delete(event); - return 0; - } - - // Extract configuration and apply to server - int result = apply_config_from_event(event); - cJSON_Delete(event); - - return result; -} -*/ - -/* -// Extract config from validated event and apply to server -int apply_config_from_event(cJSON *event) { - sqlite3 *db; - sqlite3_stmt *stmt; - int rc; - - // Open database for config storage - rc = sqlite3_open_v2(DB_PATH, &db, SQLITE_OPEN_READWRITE, NULL); - if (rc) { - fprintf(stderr, "Failed to open database for config\n"); - return 0; - } - - // Extract admin pubkey from event - cJSON *pubkey_json = cJSON_GetObjectItem(event, "pubkey"); - if (!pubkey_json || !cJSON_IsString(pubkey_json)) { - sqlite3_close(db); - return 0; - } - const char *admin_pubkey = cJSON_GetStringValue(pubkey_json); - - // Store admin pubkey in database - const char *insert_sql = "INSERT OR REPLACE INTO config (key, value, " - "description) VALUES (?, ?, ?)"; - rc = sqlite3_prepare_v2(db, insert_sql, -1, &stmt, NULL); - if (rc == SQLITE_OK) { - sqlite3_bind_text(stmt, 1, "admin_pubkey", -1, SQLITE_STATIC); - sqlite3_bind_text(stmt, 2, admin_pubkey, -1, SQLITE_STATIC); - sqlite3_bind_text(stmt, 3, "Admin public key from config event", -1, - SQLITE_STATIC); - sqlite3_step(stmt); - sqlite3_finalize(stmt); - } - - // Extract server private key and store securely (in memory only) - cJSON *tags = cJSON_GetObjectItem(event, "tags"); - if (tags && cJSON_IsArray(tags)) { - cJSON *tag = NULL; - cJSON_ArrayForEach(tag, tags) { - if (!cJSON_IsArray(tag)) - continue; - - cJSON *tag_name = cJSON_GetArrayItem(tag, 0); - cJSON *tag_value = cJSON_GetArrayItem(tag, 1); - - if (!tag_name || !cJSON_IsString(tag_name) || !tag_value || - !cJSON_IsString(tag_value)) - continue; - - const char *key = cJSON_GetStringValue(tag_name); - const char *value = cJSON_GetStringValue(tag_value); - - if (strcmp(key, "server_privkey") == 0) { - // Store server private key in global variable (memory only) - // strncpy(server_private_key, value, sizeof(server_private_key) - 1); - // server_private_key[sizeof(server_private_key) - 1] = '\0'; - } else { - // Store other config values in database - rc = sqlite3_prepare_v2(db, insert_sql, -1, &stmt, NULL); - if (rc == SQLITE_OK) { - sqlite3_bind_text(stmt, 1, key, -1, SQLITE_STATIC); - sqlite3_bind_text(stmt, 2, value, -1, SQLITE_STATIC); - sqlite3_bind_text(stmt, 3, "From config event", -1, SQLITE_STATIC); - sqlite3_step(stmt); - sqlite3_finalize(stmt); - } - } - } - } - - sqlite3_close(db); - return 1; -} -*/ - -/* -// Interactive setup runner -int run_interactive_setup(const char *config_path) { - printf("\n=== Ginxsom First-Time Setup Required ===\n"); - printf("No configuration found at: %s\n\n", config_path); - printf("Options:\n"); - printf("1. Run interactive setup wizard\n"); - printf("2. Exit and create config manually\n"); - printf("Choice (1/2): "); - - char choice[10]; - if (!fgets(choice, sizeof(choice), stdin)) { - return 1; - } - - if (choice[0] == '1') { - // Run setup script - char script_path[512]; - snprintf(script_path, sizeof(script_path), "./scripts/setup.sh \"%s\"", - config_path); - return system(script_path); - } else { - printf("\nManual setup instructions:\n"); - printf("1. Run: ./scripts/generate_config.sh\n"); - printf("2. Place signed config at: %s\n", config_path); - printf("3. Restart ginxsom\n"); - return 1; - } -} -*/ // Function declarations void handle_options_request(void); @@ -434,7 +189,23 @@ int file_exists_with_type(const char *sha256, const char *mime_type) { char filepath[MAX_PATH_LEN]; const char *extension = mime_to_extension(mime_type); - snprintf(filepath, sizeof(filepath), "blobs/%s%s", sha256, extension); + // Construct path safely + size_t dir_len = strlen(g_storage_dir); + size_t sha_len = strlen(sha256); + size_t ext_len = strlen(extension); + size_t total_len = dir_len + 1 + sha_len + ext_len + 1; // +1 for /, +1 for null + + if (total_len > sizeof(filepath)) { + fprintf(stderr, "WARNING: File path too long for buffer: %s/%s%s\n", g_storage_dir, sha256, extension); + return 0; + } + + // Build path manually to avoid compiler warnings + memcpy(filepath, g_storage_dir, dir_len); + filepath[dir_len] = '/'; + memcpy(filepath + dir_len + 1, sha256, sha_len); + memcpy(filepath + dir_len + 1 + sha_len, extension, ext_len); + filepath[total_len - 1] = '\0'; struct stat st; int result = stat(filepath, &st); @@ -524,18 +295,6 @@ const char *extract_sha256_from_uri(const char *uri) { return sha256_buffer; } -///////////////////////////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////////////////////////// -// BUD 02 - Upload & Authentication -///////////////////////////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////////////////////////// - - -///////////////////////////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////////////////////////// -// AUTHENTICATION RULES SYSTEM (4.1.2) -///////////////////////////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////// @@ -911,7 +670,23 @@ void handle_delete_request_with_validation(const char *sha256, nostr_request_res } char filepath[MAX_PATH_LEN]; - snprintf(filepath, sizeof(filepath), "blobs/%s%s", sha256, extension); + // Construct path safely + size_t dir_len = strlen(g_storage_dir); + size_t sha_len = strlen(sha256); + size_t ext_len = strlen(extension); + size_t total_len = dir_len + 1 + sha_len + ext_len + 1; // +1 for /, +1 for null + + if (total_len > sizeof(filepath)) { + fprintf(stderr, "WARNING: File path too long for buffer: %s/%s%s\n", g_storage_dir, sha256, extension); + // Continue anyway - unlink will fail gracefully + } else { + // Build path manually to avoid compiler warnings + memcpy(filepath, g_storage_dir, dir_len); + filepath[dir_len] = '/'; + memcpy(filepath + dir_len + 1, sha256, sha_len); + memcpy(filepath + dir_len + 1 + sha_len, extension, ext_len); + filepath[total_len - 1] = '\0'; + } // Delete the physical file if (unlink(filepath) != 0) { @@ -1029,9 +804,29 @@ void handle_upload_request(void) { // Determine file extension from Content-Type using centralized mapping const char *extension = mime_to_extension(content_type); - // Save file to blobs directory with SHA-256 + extension + // Save file to storage directory with SHA-256 + extension char filepath[MAX_PATH_LEN]; - snprintf(filepath, sizeof(filepath), "blobs/%s%s", sha256_hex, extension); + // Construct path safely + size_t dir_len = strlen(g_storage_dir); + size_t sha_len = strlen(sha256_hex); + size_t ext_len = strlen(extension); + size_t total_len = dir_len + 1 + sha_len + ext_len + 1; // +1 for /, +1 for null + + if (total_len > sizeof(filepath)) { + fprintf(stderr, "WARNING: File path too long for buffer: %s/%s%s\n", g_storage_dir, sha256_hex, extension); + printf("Status: 500 Internal Server Error\r\n"); + + printf("Content-Type: text/plain\r\n\r\n"); + printf("File path too long\n"); + return; + } + + // Build path manually to avoid compiler warnings + memcpy(filepath, g_storage_dir, dir_len); + filepath[dir_len] = '/'; + memcpy(filepath + dir_len + 1, sha256_hex, sha_len); + memcpy(filepath + dir_len + 1 + sha_len, extension, ext_len); + filepath[total_len - 1] = '\0'; FILE *outfile = fopen(filepath, "wb"); if (!outfile) { @@ -1280,9 +1075,29 @@ void handle_upload_request_with_validation(nostr_request_result_t* validation_re // Determine file extension from Content-Type using centralized mapping const char *extension = mime_to_extension(content_type); - // Save file to blobs directory with SHA-256 + extension + // Save file to storage directory with SHA-256 + extension char filepath[MAX_PATH_LEN]; - snprintf(filepath, sizeof(filepath), "blobs/%s%s", sha256_hex, extension); + // Construct path safely + size_t dir_len = strlen(g_storage_dir); + size_t sha_len = strlen(sha256_hex); + size_t ext_len = strlen(extension); + size_t total_len = dir_len + 1 + sha_len + ext_len + 1; // +1 for /, +1 for null + + if (total_len > sizeof(filepath)) { + fprintf(stderr, "WARNING: File path too long for buffer: %s/%s%s\n", g_storage_dir, sha256_hex, extension); + printf("Status: 500 Internal Server Error\r\n"); + + printf("Content-Type: text/plain\r\n\r\n"); + printf("File path too long\n"); + return; + } + + // Build path manually to avoid compiler warnings + memcpy(filepath, g_storage_dir, dir_len); + filepath[dir_len] = '/'; + memcpy(filepath + dir_len + 1, sha256_hex, sha_len); + memcpy(filepath + dir_len + 1 + sha_len, extension, ext_len); + filepath[total_len - 1] = '\0'; FILE *outfile = fopen(filepath, "wb"); if (!outfile) { @@ -1480,7 +1295,31 @@ void handle_auth_challenge_request(void) { ///////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////// -int main(void) { +int main(int argc, char *argv[]) { + // Parse command line arguments + for (int i = 1; i < argc; i++) { + if (strcmp(argv[i], "--db-path") == 0 && i + 1 < argc) { + strncpy(g_db_path, argv[i + 1], sizeof(g_db_path) - 1); + i++; // Skip next argument + } else if (strcmp(argv[i], "--storage-dir") == 0 && i + 1 < argc) { + strncpy(g_storage_dir, argv[i + 1], sizeof(g_storage_dir) - 1); + i++; // Skip next argument + } else if (strcmp(argv[i], "--help") == 0 || strcmp(argv[i], "-h") == 0) { + printf("Usage: %s [options]\n", argv[0]); + printf("Options:\n"); + printf(" --db-path PATH Database file path (default: db/ginxsom.db)\n"); + printf(" --storage-dir DIR Storage directory for files (default: blobs)\n"); + printf(" --help, -h Show this help message\n"); + return 0; + } else { + fprintf(stderr, "Unknown option: %s\n", argv[i]); + fprintf(stderr, "Use --help for usage information\n"); + return 1; + } + } + + fprintf(stderr, "STARTUP: Using database path: %s\n", g_db_path); + fprintf(stderr, "STARTUP: Using storage directory: %s\n", g_storage_dir); // Initialize server configuration and identity // Try file-based config first, then fall back to database config diff --git a/test_blob_1762770636.txt b/test_blob_1762770636.txt new file mode 100644 index 0000000..b80e07b --- /dev/null +++ b/test_blob_1762770636.txt @@ -0,0 +1,7 @@ +Test blob content for Ginxsom Blossom server (PRODUCTION) +Timestamp: 2025-11-10T06:30:36-04:00 +Random data: bb7d8d5206aadf4ecd48829f9674454c160bae68e98c6ce5f7f678f997dbe86a +Test message: Hello from production test! + +This file is used to test the upload functionality +of the Ginxsom Blossom server on blossom.laantungir.net diff --git a/tests/file_put_bud02.sh b/tests/file_put_bud02.sh index 1ac1a79..31a2fe7 100755 --- a/tests/file_put_bud02.sh +++ b/tests/file_put_bud02.sh @@ -6,7 +6,8 @@ set -e # Exit on any error # Configuration -SERVER_URL="http://localhost:9001" +# SERVER_URL="http://localhost:9001" +SERVER_URL="https://localhost:9443" UPLOAD_ENDPOINT="${SERVER_URL}/upload" TEST_FILE="test_blob_$(date +%s).txt" CLEANUP_FILES=() @@ -87,7 +88,7 @@ check_prerequisites() { check_server() { log_info "Checking if server is running..." - if curl -s -f "${SERVER_URL}/health" > /dev/null 2>&1; then + if curl -k -s -f "${SERVER_URL}/health" > /dev/null 2>&1; then log_success "Server is running at ${SERVER_URL}" else log_error "Server is not responding at ${SERVER_URL}" @@ -168,7 +169,7 @@ perform_upload() { CLEANUP_FILES+=("${RESPONSE_FILE}") # Perform the upload with verbose output - HTTP_STATUS=$(curl -s -w "%{http_code}" \ + HTTP_STATUS=$(curl -k -s -w "%{http_code}" \ -X PUT \ -H "Authorization: ${AUTH_HEADER}" \ -H "Content-Type: text/plain" \ @@ -217,7 +218,7 @@ test_retrieval() { RETRIEVAL_URL="${SERVER_URL}/${HASH}" - if curl -s -f "${RETRIEVAL_URL}" > /dev/null 2>&1; then + if curl -k -s -f "${RETRIEVAL_URL}" > /dev/null 2>&1; then log_success "File can be retrieved at: ${RETRIEVAL_URL}" else log_warning "File not yet available for retrieval (expected if upload processing not implemented)" diff --git a/tests/file_put_production.sh b/tests/file_put_production.sh new file mode 100755 index 0000000..010ca65 --- /dev/null +++ b/tests/file_put_production.sh @@ -0,0 +1,265 @@ +#!/bin/bash + +# file_put_production.sh - Test script for production Ginxsom Blossom server +# Tests upload functionality on blossom.laantungir.net + +set -e # Exit on any error + +# Configuration +SERVER_URL="https://blossom.laantungir.net" +UPLOAD_ENDPOINT="${SERVER_URL}/upload" +TEST_FILE="test_blob_$(date +%s).txt" +CLEANUP_FILES=() + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# Cleanup function +cleanup() { + echo -e "${YELLOW}Cleaning up temporary files...${NC}" + for file in "${CLEANUP_FILES[@]}"; do + if [[ -f "$file" ]]; then + rm -f "$file" + echo "Removed: $file" + fi + done +} + +# Set up cleanup on exit +trap cleanup EXIT + +# Helper functions +log_info() { + echo -e "${BLUE}[INFO]${NC} $1" +} + +log_success() { + echo -e "${GREEN}[SUCCESS]${NC} $1" +} + +log_error() { + echo -e "${RED}[ERROR]${NC} $1" +} + +log_warning() { + echo -e "${YELLOW}[WARNING]${NC} $1" +} + +# Check prerequisites +check_prerequisites() { + log_info "Checking prerequisites..." + + # Check if nak is installed + if ! command -v nak &> /dev/null; then + log_error "nak command not found. Please install nak first." + log_info "Install with: go install github.com/fiatjaf/nak@latest" + exit 1 + fi + log_success "nak is installed" + + # Check if curl is available + if ! command -v curl &> /dev/null; then + log_error "curl command not found. Please install curl." + exit 1 + fi + log_success "curl is available" + + # Check if sha256sum is available + if ! command -v sha256sum &> /dev/null; then + log_error "sha256sum command not found." + exit 1 + fi + log_success "sha256sum is available" + + # Check if base64 is available + if ! command -v base64 &> /dev/null; then + log_error "base64 command not found." + exit 1 + fi + log_success "base64 is available" +} + +# Check if server is running +check_server() { + log_info "Checking if server is running..." + + if curl -s -f "${SERVER_URL}/health" > /dev/null 2>&1; then + log_success "Server is running at ${SERVER_URL}" + else + log_error "Server is not responding at ${SERVER_URL}" + exit 1 + fi +} + +# Create test file +create_test_file() { + log_info "Creating test file: ${TEST_FILE}" + + # Create test content with timestamp and random data + cat > "${TEST_FILE}" << EOF +Test blob content for Ginxsom Blossom server (PRODUCTION) +Timestamp: $(date -Iseconds) +Random data: $(openssl rand -hex 32) +Test message: Hello from production test! + +This file is used to test the upload functionality +of the Ginxsom Blossom server on blossom.laantungir.net +EOF + + CLEANUP_FILES+=("${TEST_FILE}") + log_success "Created test file with $(wc -c < "${TEST_FILE}") bytes" +} + +# Calculate file hash +calculate_hash() { + log_info "Calculating SHA-256 hash..." + + HASH=$(sha256sum "${TEST_FILE}" | cut -d' ' -f1) + + log_success "Data to hash: ${TEST_FILE}" + log_success "File hash: ${HASH}" +} + +# Generate nostr event +generate_nostr_event() { + log_info "Generating kind 24242 nostr event with nak..." + + # Calculate expiration time (1 hour from now) + EXPIRATION=$(date -d '+1 hour' +%s) + + # Generate the event using nak + EVENT_JSON=$(nak event -k 24242 -c "" \ + -t "t=upload" \ + -t "x=${HASH}" \ + -t "expiration=${EXPIRATION}") + + if [[ -z "$EVENT_JSON" ]]; then + log_error "Failed to generate nostr event" + exit 1 + fi + + log_success "Generated nostr event" + echo "Event JSON: $EVENT_JSON" +} + +# Create authorization header +create_auth_header() { + log_info "Creating authorization header..." + + # Base64 encode the event (without newlines) + AUTH_B64=$(echo -n "$EVENT_JSON" | base64 -w 0) + AUTH_HEADER="Nostr ${AUTH_B64}" + + log_success "Created authorization header" + echo "Auth header length: ${#AUTH_HEADER} characters" +} + +# Perform upload +perform_upload() { + log_info "Performing upload to ${UPLOAD_ENDPOINT}..." + + # Create temporary file for response + RESPONSE_FILE=$(mktemp) + CLEANUP_FILES+=("${RESPONSE_FILE}") + + # Perform the upload with verbose output + HTTP_STATUS=$(curl -s -w "%{http_code}" \ + -X PUT \ + -H "Authorization: ${AUTH_HEADER}" \ + -H "Content-Type: text/plain" \ + -H "Content-Disposition: attachment; filename=\"${TEST_FILE}\"" \ + --data-binary "@${TEST_FILE}" \ + "${UPLOAD_ENDPOINT}" \ + -o "${RESPONSE_FILE}") + + echo "HTTP Status: ${HTTP_STATUS}" + echo "Response body:" + cat "${RESPONSE_FILE}" + echo + + # Check response + case "${HTTP_STATUS}" in + 200) + log_success "Upload successful!" + ;; + 201) + log_success "Upload successful (created)!" + ;; + 400) + log_error "Bad request - check the event format" + ;; + 401) + log_error "Unauthorized - authentication failed" + ;; + 405) + log_error "Method not allowed - check nginx configuration" + ;; + 413) + log_error "Payload too large" + ;; + 501) + log_warning "Upload endpoint not yet implemented (expected for now)" + ;; + *) + log_error "Upload failed with HTTP status: ${HTTP_STATUS}" + ;; + esac +} + +# Test file retrieval +test_retrieval() { + log_info "Testing file retrieval..." + + RETRIEVAL_URL="${SERVER_URL}/${HASH}" + + if curl -s -f "${RETRIEVAL_URL}" > /dev/null 2>&1; then + log_success "File can be retrieved at: ${RETRIEVAL_URL}" + + # Download and verify + DOWNLOADED_FILE=$(mktemp) + CLEANUP_FILES+=("${DOWNLOADED_FILE}") + curl -s "${RETRIEVAL_URL}" -o "${DOWNLOADED_FILE}" + + DOWNLOADED_HASH=$(sha256sum "${DOWNLOADED_FILE}" | cut -d' ' -f1) + if [[ "${DOWNLOADED_HASH}" == "${HASH}" ]]; then + log_success "Downloaded file hash matches! Verification successful." + else + log_error "Hash mismatch! Expected: ${HASH}, Got: ${DOWNLOADED_HASH}" + fi + else + log_warning "File not yet available for retrieval" + fi +} + +# Main execution +main() { + echo "=== Ginxsom Blossom Production Upload Test ===" + echo "Server: ${SERVER_URL}" + echo "Timestamp: $(date -Iseconds)" + echo + + check_prerequisites + check_server + create_test_file + calculate_hash + generate_nostr_event + create_auth_header + perform_upload + test_retrieval + + echo + log_info "Test completed!" + echo "Summary:" + echo " Test file: ${TEST_FILE}" + echo " File hash: ${HASH}" + echo " Server: ${SERVER_URL}" + echo " Upload endpoint: ${UPLOAD_ENDPOINT}" + echo " Retrieval URL: ${SERVER_URL}/${HASH}" +} + +# Run main function +main "$@" \ No newline at end of file diff --git a/tests/mirror_test_bud04.sh b/tests/mirror_test_bud04.sh index 7045bd2..bc9279f 100755 --- a/tests/mirror_test_bud04.sh +++ b/tests/mirror_test_bud04.sh @@ -3,18 +3,31 @@ # Mirror Test Script for BUD-04 # Tests the PUT /mirror endpoint with a sample PNG file and NIP-42 authentication +# ============================================================================ +# CONFIGURATION - Choose your target Blossom server +# ============================================================================ + +# Local server (uncomment to use) +BLOSSOM_SERVER="http://localhost:9001" + +# Remote server (uncomment to use) +#BLOSSOM_SERVER="https://blossom.laantungir.net" + +# ============================================================================ + # Test URL - PNG file with known SHA-256 hash TEST_URL="https://laantungir.github.io/img_repo/24308d48eb498b593e55a87b6300ccffdea8432babc0bb898b1eff21ebbb72de.png" EXPECTED_HASH="24308d48eb498b593e55a87b6300ccffdea8432babc0bb898b1eff21ebbb72de" echo "=== BUD-04 Mirror Endpoint Test with Authentication ===" +echo "Blossom Server: $BLOSSOM_SERVER" echo "Target URL: $TEST_URL" echo "Expected Hash: $EXPECTED_HASH" echo "" # Get a fresh challenge from the server echo "=== Getting Authentication Challenge ===" -challenge=$(curl -s "http://localhost:9001/auth" | jq -r '.challenge') +challenge=$(curl -s "$BLOSSOM_SERVER/auth" | jq -r '.challenge') if [ "$challenge" = "null" ] || [ -z "$challenge" ]; then echo "❌ Failed to get challenge from server" exit 1 @@ -48,7 +61,7 @@ RESPONSE=$(curl -s -w "\nHTTP_CODE:%{http_code}\n" \ -H "Authorization: $auth_header" \ -H "Content-Type: application/json" \ -d "$JSON_BODY" \ - http://localhost:9001/mirror) + "$BLOSSOM_SERVER/mirror") echo "Response:" echo "$RESPONSE" @@ -65,9 +78,9 @@ if [ "$HTTP_CODE" = "200" ]; then # Try to access the mirrored blob echo "" echo "=== Verifying Mirrored Blob ===" - echo "Attempting to fetch: http://localhost:9001/$EXPECTED_HASH.png" + echo "Attempting to fetch: $BLOSSOM_SERVER/$EXPECTED_HASH.png" - BLOB_RESPONSE=$(curl -s -w "HTTP_CODE:%{http_code}" -I "http://localhost:9001/$EXPECTED_HASH.png") + BLOB_RESPONSE=$(curl -s -w "HTTP_CODE:%{http_code}" -I "$BLOSSOM_SERVER/$EXPECTED_HASH.png") BLOB_HTTP_CODE=$(echo "$BLOB_RESPONSE" | grep "HTTP_CODE:" | cut -d: -f2) if [ "$BLOB_HTTP_CODE" = "200" ]; then @@ -82,7 +95,7 @@ if [ "$HTTP_CODE" = "200" ]; then # Test HEAD request for metadata echo "" echo "=== Testing HEAD Request ===" - HEAD_RESPONSE=$(curl -s -w "HTTP_CODE:%{http_code}" -I -X HEAD "http://localhost:9001/$EXPECTED_HASH") + HEAD_RESPONSE=$(curl -s -w "HTTP_CODE:%{http_code}" -I -X HEAD "$BLOSSOM_SERVER/$EXPECTED_HASH") HEAD_HTTP_CODE=$(echo "$HEAD_RESPONSE" | grep "HTTP_CODE:" | cut -d: -f2) if [ "$HEAD_HTTP_CODE" = "200" ]; then