diff --git a/.gitignore b/.gitignore index b706f75..f2df2c1 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,4 @@ media # End of https://www.gitignore.io/api/django /static/ /var/ +.venv/ diff --git a/README.md b/README.md index 35bb288..8c4bdfe 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,17 @@ -Pasteque -======== +# Pasteque -About ------ -**Pasteque** is a free and open source (MIT License) **Pastebin like** application written in Python/Django. +## About -Demo ----- -A **demo** instance of **Pasteque** is running at [http://paste.henriet.eu](http://paste.henriet.eu). +**Pasteque** is a free and open source (MIT License) **Pastebin like** +application written in Python/Django. + +An instance can be found at: [wyz.fr](https://wyz.fr). The wyz.fr +instance is installed by ansible, the role is available here: +https://github.com/JulienPalard/playbooks/tree/master/roles/pasteque. + + +## Features -Features --------- - Support any database supported by Django (Sqlite3, MySQL, PostgreSQL, Oracle, ...) - Available in english, french .. and easily translatable into another languages. - Syntax highlighting for a bunch of languages using Pygments. @@ -21,165 +22,32 @@ Features - Limit pastes size. - Pastes history. -Upcoming releases features --------------------------- -- Duplicate paste -- Locale selector -- Search engine -- Disable pastes via link submitted by email -- Copy to clipboard JS -- Google Analytics easy-integration -Deployment with Sqlite3, nginx and UWSGI ----------------------------------------- +## Running Pasteque -This procedure will guide you step-by-step through the setup of your own instance of **Pasteque** using -nginx et UWSGI. In this tutorial, app files and servers processes are owned by unprivilegied **web** user. +In a [venv](https://docs.python.org/3/library/venv.html), install the requirements: -### Pre-required system packages + pip install -r requirements.txt -It is assumed that some system packages are installed on the server where you plan to setup **Pasteque**. +In `settings.py` edit: -**On Debian** -
-sudo apt-get install python python-pip python-dev nginx git
-
+ DISPLAY_NAME = 'YourCompany-Paste' + COMPRESS_ENABLED = True + SECRET_KEY = 'fill_a_secret_key_here' + ALLOWED_HOSTS = ['localhost','127.0.0.1','paste.henriet.eu'] -### Application deployment +Then create the database: -The application is deployed into **/opt/app/webtools** which is owner by user **web**. + ./manage.py migrate -
-sudo mkdir -p /opt/app/webtools/
-sudo chown -R web: /opt/app/webtools/
-cd /opt/app/webtools/
-git clone https://github.com/setsuna-/pasteque .
-mkdir -p var/logs var/db var/pygments-static
-
+Insert initial data (like known languages): -### Install required python packages + ./manage.py loaddata initial -Even if python packages are installed system-wide in this tutorial, **virtualenv** is of course the way to go. +If you're in production collect static files: -
-sudo -s
-export CFLAGS="-march=native -O2 -fomit-frame-pointer -pipe" && export CXXFLAGS="-march=native -O2 -fomit-frame-pointer -pipe"
-pip install -r /opt/app/webtools/share/requirements.pip
-
+ ./manage.py collectstatic -### Pasteque configuration and customization +Run it: -
-vim /opt/app/webtools/webtools/settings.py
-DISPLAY_NAME = 'YourCompany-Paste'
-COMPRESS_ENABLED = True
-SECRET_KEY = 'fill_a_secret_key_here'
-ALLOWED_HOSTS = ['localhost','127.0.0.1','paste.henriet.eu']
-
- -### Sqlite3 database creation - -
-cd /opt/app/webtools/
-./manage.py syncdb
-Creating tables ...
-Creating table paste_language
-Creating table paste_paste
-Installing custom SQL ...
-Installing indexes ...
-Installed 0 object(s) from 0 fixture(s)
-sqlite3 var/db/webtools.sqlite3
-sqlite> .read share/language-dml.sql
-sqlite> .quit
-
- -### Deploy static assets - -
-./manage.py collectstatic
-ls static/
-css  font  img  js
-
- -### Test application - -Validate application setup using the development web server. - -
-./manage.py runserver paste.henriet.eu:16000
-
- -### Configure UWSGI - -
-cp /opt/app/webtools/share/uwsgi.ini /opt/app/webtools/uwsgi.ini
-vim /opt/app/webtools/uwsgi.ini
-[uwsgi]
-chdir=/opt/app/webtools
-module=webtools.wsgi:application
-master=True
-env=DJANGO_SETTINGS_MODULE=webtools.settings
-pidfile=/opt/app/webtools/var/uwsgid-pasteque.pid
-socket=/opt/app/webtools/var/uwsgid-pasteque.sock
-processes=5
-uid=1002
-gid=1002
-harakiri=20
-limit-as=128
-max-requests=5000
-vacuum=True
-daemonize=/opt/app/webtools/var/uwsgid-pasteque.log
-
- -### Run UWSGI - -
-uwsgi --ini /opt/app/webtools/uwsgi.ini
-[uWSGI] getting INI configuration from /opt/app/webtools/uwsgi.ini
-ps -ef |grep uwsgi
-web     2269     1  0 11:32 ?        00:00:00 uwsgi --ini /opt/app/webtools/uwsgi.ini
-web     2271  2269  0 11:32 ?        00:00:00 uwsgi --ini /opt/app/webtools/uwsgi.ini
-web     2272  2269  0 11:32 ?        00:00:00 uwsgi --ini /opt/app/webtools/uwsgi.ini
-web     2273  2269  0 11:32 ?        00:00:00 uwsgi --ini /opt/app/webtools/uwsgi.ini
-web     2274  2269  0 11:32 ?        00:00:00 uwsgi --ini /opt/app/webtools/uwsgi.ini
-web     2275  2269  0 11:32 ?        00:00:00 uwsgi --ini /opt/app/webtools/uwsgi.ini
-cat /opt/app/webtools/var/uwsgid-pasteque.log to check if everything is ok.
-
- -### Configure NGINX - -
-sudo vim /etc/nginx/nginx.conf
-user web;
-sudo vim /etc/nginx/sites-available/webtools-pasteque
-upstream uwsgi {
-  server unix:///opt/app/webtools/var/uwsgid-pasteque.sock;
-}
-server {
-  listen               80;
-  server_name          paste.henriet.eu;
-  charset              utf-8;
-  error_log            /opt/app/webtools/var/nginx-error.log;
-  access_log           /opt/app/webtools/var/nginx-access.log;
-  client_max_body_size 8M;
-  
-  location /static {
-    alias /opt/app/webtools/static;
-    expires 30d;
-  }
-
-  location / {
-    uwsgi_pass uwsgi;
-    include    /etc/nginx/uwsgi_params;
-  }
-}
-cd /etc/nginx/sites-enabled/
-sudo ln -s ../sites-available/webtools-pasteque
-
- -### Run nginx - -
-sudo /etc/init.d/nginx restart
-Restarting nginx: nginx.
-
+ ./manage.py runserver diff --git a/clean_instance.sh b/clean_instance.sh deleted file mode 100755 index 7165a6e..0000000 --- a/clean_instance.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/env bash - -# Clean the database instead of erasing it -# sqlite3 var/db/webtools.sqlite3 "delete from paste_paste;" -[ -f var/db/webtools.sqlite3 ] && rm var/db/webtools.sqlite3 -rm -rf var/cache/* -rm -rf var/logs/* -rm -rf static/* -find . -name "*.pyc" -exec rm {} +; diff --git a/paste/fixtures/initial.json b/paste/fixtures/initial.json new file mode 100644 index 0000000..332a4e4 --- /dev/null +++ b/paste/fixtures/initial.json @@ -0,0 +1 @@ +[{"model": "paste.language", "pk": 1, "fields": {"name": "Bash (shell)", "slug": "bash"}}, {"model": "paste.language", "pk": 2, "fields": {"name": "C#", "slug": "csharp"}}, {"model": "paste.language", "pk": 3, "fields": {"name": "C", "slug": "c"}}, {"model": "paste.language", "pk": 4, "fields": {"name": "C++", "slug": "cpp"}}, {"model": "paste.language", "pk": 5, "fields": {"name": "CSS", "slug": "css"}}, {"model": "paste.language", "pk": 6, "fields": {"name": "Diff", "slug": "diff"}}, {"model": "paste.language", "pk": 7, "fields": {"name": "Go", "slug": "go"}}, {"model": "paste.language", "pk": 8, "fields": {"name": "HTML", "slug": "html"}}, {"model": "paste.language", "pk": 9, "fields": {"name": "Java", "slug": "java"}}, {"model": "paste.language", "pk": 10, "fields": {"name": "Javascript", "slug": "javascript"}}, {"model": "paste.language", "pk": 11, "fields": {"name": "Perl", "slug": "perl"}}, {"model": "paste.language", "pk": 12, "fields": {"name": "PHP", "slug": "php"}}, {"model": "paste.language", "pk": 13, "fields": {"name": "Plain text", "slug": "text"}}, {"model": "paste.language", "pk": 14, "fields": {"name": "Python", "slug": "python"}}, {"model": "paste.language", "pk": 15, "fields": {"name": "Ruby", "slug": "ruby"}}, {"model": "paste.language", "pk": 16, "fields": {"name": "SQL", "slug": "sql"}}, {"model": "paste.language", "pk": 17, "fields": {"name": "XML", "slug": "xml"}}, {"model": "paste.language", "pk": 18, "fields": {"name": "YAML", "slug": "yaml"}}] \ No newline at end of file diff --git a/requirements.in b/requirements.in new file mode 100644 index 0000000..576d9a1 --- /dev/null +++ b/requirements.in @@ -0,0 +1,4 @@ +Django +Pygments +shortuuid +django_compressor diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..8f468c0 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,17 @@ +# +# This file is autogenerated by pip-compile +# To update, run: +# +# pip-compile requirements.in +# +asgiref==3.2.7 # via django +django-appconf==1.0.4 # via django-compressor +django-compressor==2.4 # via -r requirements.in +django==3.0.6 # via -r requirements.in, django-appconf +pygments==2.6.1 # via -r requirements.in +pytz==2020.1 # via django +rcssmin==1.0.6 # via django-compressor +rjsmin==1.1.0 # via django-compressor +shortuuid==1.0.1 # via -r requirements.in +six==1.15.0 # via django-compressor +sqlparse==0.3.1 # via django diff --git a/share/language-dml.sql b/share/language-dml.sql deleted file mode 100644 index 48a66ee..0000000 --- a/share/language-dml.sql +++ /dev/null @@ -1,18 +0,0 @@ -INSERT INTO paste_language (name, slug) VALUES ('Bash (shell)', 'bash'); -INSERT INTO paste_language (name, slug) VALUES ('C#','csharp'); -INSERT INTO paste_language (name, slug) VALUES ('C','c'); -INSERT INTO paste_language (name, slug) VALUES ('C++','cpp'); -INSERT INTO paste_language (name, slug) VALUES ('CSS','css'); -INSERT INTO paste_language (name, slug) VALUES ('Diff','diff'); -INSERT INTO paste_language (name, slug) VALUES ('Go','go'); -INSERT INTO paste_language (name, slug) VALUES ('HTML','html'); -INSERT INTO paste_language (name, slug) VALUES ('Java','java'); -INSERT INTO paste_language (name, slug) VALUES ('Javascript','javascript'); -INSERT INTO paste_language (name, slug) VALUES ('Perl','perl'); -INSERT INTO paste_language (name, slug) VALUES ('PHP','php'); -INSERT INTO paste_language (name, slug) VALUES ('Plain text','text'); -INSERT INTO paste_language (name, slug) VALUES ('Python','python'); -INSERT INTO paste_language (name, slug) VALUES ('Ruby','ruby'); -INSERT INTO paste_language (name, slug) VALUES ('SQL','sql'); -INSERT INTO paste_language (name, slug) VALUES ('XML','xml'); -INSERT INTO paste_language (name, slug) VALUES ('YAML','yaml'); diff --git a/share/requirements.pip b/share/requirements.pip deleted file mode 100644 index aae97fb..0000000 --- a/share/requirements.pip +++ /dev/null @@ -1,6 +0,0 @@ -Django==2.0.5 -uWSGI==2.0.17 -Pygments==2.2.0 -shortuuid==0.5.0 -django_compressor==2.2 -beautifulsoup4==4.6.0 diff --git a/share/uwsgi.ini b/share/uwsgi.ini deleted file mode 100644 index 4434fcf..0000000 --- a/share/uwsgi.ini +++ /dev/null @@ -1,15 +0,0 @@ -[uwsgi] -chdir=/opt/app/webtools -module=webtools.wsgi:application -master=True -env=DJANGO_SETTINGS_MODULE=webtools.settings -pidfile=/opt/app/webtools/var/uwsgid-pasteque.pid -socket=/opt/app/webtools/var/uwsgid-pasteque.sock -processes=5 -uid=1000 -gid=1000 -harakiri=20 -limit-as=128 -max-requests=5000 -vacuum=True -daemonize=/opt/app/webtools/var/uwsgid-pasteque.log diff --git a/share/uwsgi.txt b/share/uwsgi.txt deleted file mode 100644 index 7d7cecd..0000000 --- a/share/uwsgi.txt +++ /dev/null @@ -1 +0,0 @@ -uwsgi --chdir=/home/alex/coding/django/webtools --module=webtools.wsgi:application --env DJANGO_SETTINGS_MODULE=webtools.settings --master --pidfile=/tmp/uwsgid-pasteque.pid --socket=/tmp/uwsgid-pasteque.sock --processes=5 --uid=1000 --gid=1000 --harakiri=20 --limit-as=128 --max-requests=5000 --vacuum --daemonize=/tmp/uwsgid-pasteque.log