No description
Find a file
2026-05-07 19:18:09 +03:00
main.go main.go 2026-05-07 19:14:02 +03:00
readme.md Обновить readme.md 2026-05-07 19:18:09 +03:00

textserver

Простой HTTP-сервер для загрузки файлов через API. Работает за nginx, принимает файлы через multipart/form-data, возвращает прямую ссылку для скачивания.

Функции

  • Загрузка файлов через curl или любой HTTP-клиент
  • API-ключ авторизация через заголовок X-Upload-Key
  • Случайные имена файлов (32 символа hex)
  • Раздача файлов через nginx (без участия Go)
  • Лимит загрузки: 500MB

Требования

  • Go 1.21+
  • nginx
  • Linux (Alpine, Debian, Ubuntu и др.)

Установка

1. Клонирование

git clone https://github.com/username/fileserver.git
cd fileserver

2. Настройка

Изменить пароль в main.go:

const uploadPassword = "password"

3. Компиляция

CGO_ENABLED=0 go build -ldflags="-s -w" -o fileserver main.go

4. Установка на сервер

sudo mkdir -p /var/www/html/uploads /opt/fileserver
sudo chown -R www-data:www-data /var/www/html/uploads
sudo cp fileserver /opt/fileserver/
sudo chmod +x /opt/fileserver/fileserver

5. Настройка nginx

location /uploads/ {
    alias /var/www/html/uploads/;
    expires 30d;
    add_header Cache-Control "public, immutable";
    
    location ~* \.(php|php3|php4|php5|phtml|pl|py|sh|cgi|rb)$ {
        deny all;
        return 403;
    }
}

location /api/upload {
    proxy_pass http://127.0.0.1:8080;
    proxy_set_header Host $host;
    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_set_header X-Forwarded-Host $host;
    
    client_max_body_size 500M;
    proxy_read_timeout 300s;
}

6. Автозапуск

systemd (Debian/Ubuntu):

sudo tee /etc/systemd/system/fileserver.service << 'EOF'
[Unit]
Description=File Upload Server
After=network.target

[Service]
Type=simple
User=www-data
Group=www-data
WorkingDirectory=/opt/fileserver
ExecStart=/opt/fileserver/fileserver
Restart=always

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable fileserver
sudo systemctl start fileserver

OpenRC (Alpine Linux):

sudo tee /etc/init.d/fileserver << 'EOF'
#!/sbin/openrc-run

name="File Upload Server"
command="/opt/fileserver/fileserver"
command_background="yes"
pidfile="/run/fileserver.pid"
directory="/opt/fileserver"
user="www-data"
group="www-data"

depend() {
    need net
    after nginx
}
EOF

sudo chmod +x /etc/init.d/fileserver
sudo rc-update add fileserver default
sudo rc-service fileserver start

Использование

Загрузка файла

curl -k -H "X-Upload-Key: password" \
  -F "file=@document.pdf" \
  https://example.com/api/upload

Ответ:

{
  "success": true,
  "url": "https://example.com/uploads/a1b2c3d4...pdf",
  "filename": "document.pdf",
  "size": 12345
}

Получить только ссылку

curl -k -s -H "X-Upload-Key: password" \
  -F "file=@image.png" \
  https://example.com/api/upload | jq -r '.url'