API
Client
-To simplify uploading and deleting files, you can use linx-client, which uses this API.
+To simplify uploading and deleting files, you can use linx-client, which uses this API.
{% if auth != "none" %}Keys
-This instance uses API Keys, therefore you will need to provide a key for uploading and deleting
- files.
To do so, add the Linx-Api-Key header with your key.
This instance uses API Keys, therefore you will need to provide a key for uploading and deleting files.
To do so, add the Linx-Api-Key header with your key.
Uploading a file
-To upload a file, make a PUT request to {{ siteurl }}upload/ and you will get the url of
- your upload back.
To upload a file, make a PUT request to {{ siteurl }}upload/ and you will get the url of your upload back.
Optional headers with the request
- {% if not forcerandom %} -Randomize the filename
- Linx-Randomize: yes
Randomize the filename
+ Linx-Randomize: yes
Specify a custom deletion key
- Linx-Delete-Key: mysecret
Specify a custom deletion key
+ Linx-Delete-Key: mysecret
Protect file with password
- Linx-Access-Key: mysecret
Protect file with password
+ Linx-Access-Key: mysecret
Specify an expiration time (in seconds)
- Linx-Expiry: 60
Specify an expiration time (in seconds)
+ Linx-Expiry: 60
Get a json response
- Accept: application/json
Get a json response
+ Accept: application/json
The json response will then contain:
-“url”: the publicly available upload url
+
- “direct_url”: the url to access the file directly
- “filename”: the (optionally generated) filename
- “delete_key”: the (optionally generated) deletion key,
- “access_key”: the (optionally supplied) access key,
- “expiry”: the unix timestamp at which the file will expire (0 if never)
- “size”: the size in bytes of the file
- “mimetype”: the guessed mimetype of the file
- “sha256sum”: the sha256sum of the file,“url”: the publicly available upload url
+ “direct_url”: the url to access the file directly
+ “filename”: the (optionally generated) filename
+ “delete_key”: the (optionally generated) deletion key,
+ “access_key”: the (optionally supplied) access key,
+ “expiry”: the unix timestamp at which the file will expire (0 if never)
+ “size”: the size in bytes of the file
+ “mimetype”: the guessed mimetype of the file
+ “sha256sum”: the sha256sum of the file,
Examples
@@ -97,8 +92,7 @@Overwriting a file
-To overwrite a file you uploaded, simply provide the Linx-Delete-Key header with the
- original file's deletion key.
To overwrite a file you uploaded, simply provide the Linx-Delete-Key header with the original file's deletion key.
Example
@@ -114,8 +108,7 @@Deleting a file
-To delete a file you uploaded, make a DELETE request to {{ siteurl }}yourfile.ext with the
- delete key set as the Linx-Delete-Key header.
To delete a file you uploaded, make a DELETE request to {{ siteurl }}yourfile.ext with the delete key set as the Linx-Delete-Key header.
Example
@@ -131,17 +124,16 @@ DELETEDInformation about a file
-To retrieve information about a file, make a GET request the public url with
- Accept: application/json headers and you will receive a json response containing:
To retrieve information about a file, make a GET request the public url with Accept: application/json headers and you will receive a json response containing:
-“url”: the publicly available upload url
+
- “direct_url”: the url to access the file directly
- “filename”: the (optionally generated) filename
- “expiry”: the unix timestamp at which the file will expire (0 if never)
- “size”: the size in bytes of the file
- “mimetype”: the guessed mimetype of the file
- “sha256sum”: the sha256sum of the file,“url”: the publicly available upload url
+ “direct_url”: the url to access the file directly
+ “filename”: the (optionally generated) filename
+ “expiry”: the unix timestamp at which the file will expire (0 if never)
+ “size”: the size in bytes of the file
+ “mimetype”: the guessed mimetype of the file
+ “sha256sum”: the sha256sum of the file,
Example
@@ -149,6 +141,6 @@ DELETED$ curl -H "Accept: application/json" {{ siteurl }}myphoto.jpg
{"expiry":"0","filename":"myphoto.jpg","mimetype":"image/jpeg","sha256sum":"...","size":"..."}
-
-
+
-Getting started
+Get release and run
-------------------
-
-#### Using Docker
-1. Create directories ```files``` and ```meta``` and run ```chown -R 65534:65534 meta && chown -R 65534:65534 files```
-2. Create a config file (example provided in repo), we'll refer to it as __linx-server.conf__ in the following examples
-
-
-
-Example running
-```
-docker run -p 8080:8080 -v /path/to/linx-server.conf:/data/linx-server.conf -v /path/to/meta:/data/meta -v /path/to/files:/data/files andreimarcu/linx-server -config /data/linx-server.conf
-```
-
-Example with docker-compose
-```
-version: '2.2'
-services:
- linx-server:
- container_name: linx-server
- image: andreimarcu/linx-server
- command: -config /data/linx-server.conf
- volumes:
- - /path/to/files:/data/files
- - /path/to/meta:/data/meta
- - /path/to/linx-server.conf:/data/linx-server.conf
- network_mode: bridge
- ports:
- - "8080:8080"
- restart: unless-stopped
-```
-Ideally, you would use a reverse proxy such as nginx or caddy to handle TLS certificates.
-
-#### Using a binary release
-
-1. Grab the latest binary from the [releases](https://github.com/andreimarcu/linx-server/releases), then run ```go install```
-2. Run ```linx-server -config path/to/linx-server.conf```
+1. Grab the latest binary from the [releases](https://github.com/andreimarcu/linx-server/releases)
+2. Run ```./linx-server```
Usage
-----
#### Configuration
-All configuration options are accepted either as arguments or can be placed in a file as such (see example file linx-server.conf.example in repo):
+All configuration options are accepted either as arguments or can be placed in an ini-style file as such:
```ini
-bind = 127.0.0.1:8080
-sitename = myLinx
maxsize = 4294967296
-maxexpiry = 86400
-# ... etc
-```
-...and then run ```linx-server -config path/to/linx-server.conf```
+allowhotlink = true
+# etc
+```
+...and then invoke ```linx-server -config path/to/config.ini```
#### Options
-
-|Option|Description
-|------|-----------
-| ```bind = 127.0.0.1:8080``` | what to bind to (default is 127.0.0.1:8080)
-| ```sitename = myLinx``` | the site name displayed on top (default is inferred from Host header)
-| ```siteurl = https://mylinx.example.org/``` | the site url (default is inferred from execution context)
-| ```selifpath = selif``` | path relative to site base url (the "selif" in mylinx.example.org/selif/image.jpg) where files are accessed directly (default: selif)
-| ```maxsize = 4294967296``` | maximum upload file size in bytes (default 4GB)
-| ```maxexpiry = 86400``` | maximum expiration time in seconds (default is 0, which is no expiry)
-| ```allowhotlink = true``` | Allow file hotlinking
-| ```contentsecuritypolicy = "..."``` | Content-Security-Policy header for pages (default is "default-src 'self'; img-src 'self' data:; style-src 'self' 'unsafe-inline'; frame-ancestors 'self';")
-| ```filecontentsecuritypolicy = "..."``` | Content-Security-Policy header for files (default is "default-src 'none'; img-src 'self'; object-src 'self'; media-src 'self'; style-src 'self' 'unsafe-inline'; frame-ancestors 'self';")
-| ```refererpolicy = "..."``` | Referrer-Policy header for pages (default is "same-origin")
-| ```filereferrerpolicy = "..."``` | Referrer-Policy header for files (default is "same-origin")
-| ```xframeoptions = "..." ``` | X-Frame-Options header (default is "SAMEORIGIN")
-| ```remoteuploads = true``` | (optionally) enable remote uploads (/upload?url=https://...)
-| ```nologs = true``` | (optionally) disable request logs in stdout
-| ```force-random-filename = true``` | (optionally) force the use of random filenames
-| ```custompagespath = custom_pages/``` | (optionally) specify path to directory containing markdown pages (must end in .md) that will be added to the site navigation (this can be useful for providing contact/support information and so on). For example, custom_pages/My_Page.md will become My Page in the site navigation
-| ```extra-footer-text = "..."``` | (optionally) Extra text above the footer for notices.
-| ```max-duration-time = 0``` | Time till expiry for files over max-duration-size. (Default is 0 for no-expiry.)
-| ```max-duration-size = 4294967296``` | Size of file before max-duration-time is used to determine expiry max time. (Default is 4GB)
-| ```disable-access-key = true``` | Disables access key usage. (Default is false.)
-| ```default-random-filename = true``` | Makes it so the random filename is not default if set false. (Default is true.)
-
-
-#### Cleaning up expired files
-When files expire, access is disabled immediately, but the files and metadata
-will persist on disk until someone attempts to access them. You can set the following option to run cleanup every few minutes. This can also be done using a separate utility found the linx-cleanup directory.
-
-
-|Option|Description
-|------|-----------
-| ```cleanup-every-minutes = 5``` | How often to clean up expired files in minutes (default is 0, which means files will be cleaned up as they are accessed)
-
+- ```-bind 127.0.0.1:8080``` -- what to bind to (default is 127.0.0.1:8080)
+- ```-sitename myLinx``` -- the site name displayed on top (default is inferred from Host header)
+- ```-siteurl "https://mylinx.example.org/"``` -- the site url (default is inferred from execution context)
+- ```-selifpath "selif"``` -- path relative to site base url (the "selif" in mylinx.example.org/selif/image.jpg) where files are accessed directly (default: selif)
+- ```-maxsize 4294967296``` -- maximum upload file size in bytes (default 4GB)
+- ```-maxexpiry 86400``` -- maximum expiration time in seconds (default is 0, which is no expiry)
+- ```-allowhotlink``` -- Allow file hotlinking
+- ```-contentsecuritypolicy "..."``` -- Content-Security-Policy header for pages (default is "default-src 'self'; img-src 'self' data:; style-src 'self' 'unsafe-inline'; frame-ancestors 'self';")
+- ```-filecontentsecuritypolicy "..."``` -- Content-Security-Policy header for files (default is "default-src 'none'; img-src 'self'; object-src 'self'; media-src 'self'; style-src 'self' 'unsafe-inline'; frame-ancestors 'self';")
+- ```-refererpolicy "..."``` -- Referrer-Policy header for pages (default is "same-origin")
+- ```-filereferrerpolicy "..."``` -- Referrer-Policy header for files (default is "same-origin")
+- ```-xframeoptions "..." ``` -- X-Frame-Options header (default is "SAMEORIGIN")
+- ```-remoteuploads``` -- (optionally) enable remote uploads (/upload?url=https://...)
+- ```-nologs``` -- (optionally) disable request logs in stdout
+- ```-force-random-filename``` -- (optionally) force the use of random filenames
#### Require API Keys for uploads
-
-|Option|Description
-|------|-----------
-| ```authfile = path/to/authfile``` | (optionally) require authorization for upload/delete by providing a newline-separated file of scrypted auth keys
-| ```remoteauthfile = path/to/remoteauthfile``` | (optionally) require authorization for remote uploads by providing a newline-separated file of scrypted auth keys
-| ```basicauth = true``` | (optionally) allow basic authorization to upload or paste files from browser when `-authfile` is enabled. When uploading, you will be prompted to enter a user and password - leave the user blank and use your auth key as the password
+- ```-authfile path/to/authfile``` -- (optionally) require authorization for upload/delete by providing a newline-separated file of scrypted auth keys
+- ```-remoteauthfile path/to/remoteauthfile``` -- (optionally) require authorization for remote uploads by providing a newline-separated file of scrypted auth keys
+- ```-basicauth``` -- (optionally) allow basic authorization to upload or paste files from browser when `-authfile` is enabled. When uploading, you will be prompted to enter a user and password - leave the user blank and use your auth key as the password
A helper utility ```linx-genkey``` is provided which hashes keys to the format required in the auth files.
@@ -140,25 +69,37 @@ The following storage backends are available:
|Name|Notes|Options
|----|-----|-------
-|LocalFS|Enabled by default, this backend uses the filesystem|```filespath = files/``` -- Path to store uploads (default is files/)