Xây dựng ứng dụng highlight code giống Pastebin với LenPaste

Giới thiệu

LenPaste là một giải pháp thay thế Pastebin với tính năng highligh code và các ghi chú cho phép tự lưu trữ trên server của riêng bạn! Ưu điểm:

  • Self Hosted - tự lưu trữ.
  • Miễn phí, mã nguồn mở.
  • API riêng.

Yêu cầu hệ thống

Tiến hành cài đặt

Cài đặt các gói cần thiết

sudo apt update
sudo apt -y install git make gcc golang

Tải về và tiến hành build

git clone https://git.lcomrade.su/root/lenpaste.git
cd ./lenpaste/
git checkout vX.X
make

Trong đó vX.X là phiên bản của LenPaste, phiên bản v1.3 là phiên bản ở thời điểm mình cài.
Sau khi hoàn thành, file lenpaste được build ra sẽ ở thư mục /disk/bin. Kiểm tra thử xem chạy được chưa:

./lenpaste

Nếu hiện ra kết quả flag is not set: -db-source tức là đã build được rồi đó. Tiếp theo, chúng ta sẽ cho LenPaste chạy cùng hệ thống thông qua systemd và truy cập qua Tên miền.
Tạo thư mục /opt/lenspate để lưu ứng dụng, tránh để ở thư mục home/user

sudo mkdir /opt/lenspate

Copy file lenpaste đã build được về thư mục đó

sudo cp /dist/bin/lenpaste /opt/lenpaste

Tạo file cấu hình cho systemd

sudo nano /etc/systemd/system/lenpaste.service

và nhập vào nội dung sau

[Unit]
Description=LenPaste

[Service]
Type=simple
WorkingDirectory=/opt/lenpaste
ExecStart=/opt/lenpaste/lenpaste -address :8181 -db-driver sqlite3 -db-source sqlite

[Install]
WantedBy=multi-user.target

Trong đó phần :8181 là chỉ thị cổng để chạy ứng dụng, thay đổi tùy ý bạn.
Lưu file lại, bật và khởi động dịch vụ lenpaste.service lên

sudo systemctl enable --now lenpaste.service
sudo systemctl start lenpaste.service

Kiểm tra xem chạy chuẩn chưa.

systemctl status lenpaste

Nếu thế này là được rồi đó

Tiếp theo, tạo file cấu hình cho Nginx để truy cập thông qua Tên miền

sudo nano /etc/nginx/sites-available/domain.com

và nhập vào nội dung sau

server {
	listen 80;
	server_name domain.com;
	return 301 https://$server_name$request_uri;
}
server {
	server_name domain.com;
	listen 443 ssl http2;

	access_log  /var/log/nginx/domain.com.access.log;
	error_log   /var/log/nginx/domain.com.error.log;

	ssl_certificate /etc/letsencrypt/live/domain.com/fullchain.pem;
	ssl_certificate_key /etc/letsencrypt/live/domain.com/privkey.pem;

	client_max_body_size 20M;

	location ~* \.(?:ico|css|js|gif|jpe?g|png|ttf|woff|)$ {
		access_log off;
		expires 30d;
		add_header Pragma public;
		add_header Cache-Control "public, mustrevalidate, proxy-revalidate";
		proxy_set_header HOST $host;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-NginX-Proxy true;
		proxy_set_header X-Forwarded-For $remote_addr;
		proxy_set_header X-Forwarded-Proto $scheme;
		proxy_next_upstream error timeout invalid_header http_500 ht>
		proxy_pass http://localhost:8181;
		proxy_redirect off;
		proxy_buffering off;
	}
	location / {
		proxy_set_header HOST $host;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-NginX-Proxy true;
		proxy_set_header X-Forwarded-For $remote_addr;
		proxy_set_header X-Forwarded-Proto $scheme;
		proxy_next_upstream error timeout invalid_header http_500 ht>
		proxy_pass http://localhost:8181;
		proxy_redirect off;
		proxy_buffering off;
	}
}

Ánh xạ, kiểm tra cấu hình có lỗi không, không lỗi khởi động lại Nginx

sudo ln -s /etc/nginx/sites-available/domain.com /etc/nginx/sites-enabled/domain.com
sudo nginx -t
sudo systemctl restart nginx

Truy cập thông qua Tên miền

Vào phần Settings, điền một số thông tin như Tên, Email hay URL ...phần này là tùy chọn.

Vậy là mình đã xây dựng được server LenPaste của riêng mình rồi đó. Chúc các bạn thành công.

Mở rộng

Trong trường hợp chỉ muốn mình bạn có thể truy cập vào và tạo highligh code, đồng thời, khi chia sẻ thì người khác có thể đọc. Bạn có thể làm như sau.
Tạo file mật khẩu, ví dụ là pass.conf đặt ở cùng thư mục với lenpaste (ở đây là /opt/lenspate).

sudo nano pass.conf

và nhập vào nội dung có dạng sau

user:password

trong đó user là tên đăng nhập, password là mật khẩu do bạn chọn.
Trong file lenpaste.service, thay phần

ExecStart=/opt/lenpaste/lenpaste -address :8181 -db-driver sqlite3 -db-source sqlite

bằng phần này

ExecStart=/opt/lenpaste/dist/bin/lenpaste -address :8181 -db-driver sqlite3 -db-source sqlite -lenpasswd-file pass.conf

Từ giờ, khi truy cập vào domain.com, các bạn sẽ cần điền tài khoản và mật khẩu.

Còn việc chia sẻ thì vẫn hiển thị bình thường cho người khác đọc.

Ví dụ đây là code mình chèn thử.